§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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…