Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why do templates allow constexpr function members with non-constexpr constructors?

Using C++14. Why will this compile:

template<unsigned N>
constexpr bool foo()
{
    std::array<char, N> arr;
    return true;
}

but not this?

constexpr bool foo()
{
    std::array<char, 10> arr; // Non-constexpr constructor 'array' cannot be used in a constant expression
    return true;
}
like image 645
Daniel Avatar asked Jan 29 '26 21:01

Daniel


2 Answers

§7.1.5 [dcl.constexpr]/p6:

If the instantiated template specialization of a constexpr function template or member function of a class template would fail to satisfy the requirements for a constexpr function or constexpr constructor, that specialization is still a constexpr function or constexpr constructor, even though a call to such a function cannot appear in a constant expression. If no specialization of the template would satisfy the requirements for a constexpr function or constexpr constructor when considered as a non-template function or constructor, the template is ill-formed; no diagnostic required.

It is valid for constexpr function templates to have some specializations that do not satisfy the constexpr requirements, and it is valid to use those specializations as long as they are not in a context that requires a constant expression.

It isn't valid, however, if no specialization of the template could satisfy constexpr requirements. Since in the general case it is impossible to determine whether all possible instantiations of a function template will fail to satisfy the constexpr requirements,the standard doesn't require a diagnostic. Hence, your code is ill-formed with no diagnostic required - the compiler can, but is not required to, report an error.

like image 131
T.C. Avatar answered Feb 01 '26 11:02

T.C.


They don't. Your test is flawed.

The problem is not detected until you actually attempt to instantiate the broken function template.

like image 27
Lightness Races in Orbit Avatar answered Feb 01 '26 10:02

Lightness Races in Orbit



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!