Using C++14. Why will this compile:
template
constexpr bool foo()
{
std::array arr;
return true;
}
but
§7.1.5 [dcl.constexpr]/p6:
If the instantiated template specialization of a
constexprfunction template or member function of a class template would fail to satisfy the requirements for aconstexprfunction orconstexprconstructor, that specialization is still aconstexprfunction orconstexprconstructor, 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 aconstexprfunction orconstexprconstructor 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.