使用C ++ 14。为什么会这样编译:
template<unsigned N>
constexpr bool foo()
{
std::array<char, N> arr;
return true;
}
但是不是吗?
constexpr bool foo()
{
std::array<char, 10> arr; // Non-constexpr constructor 'array' cannot be used in a constant expression
return true;
}
§7.1.5[dcl.constexpr] / p6:
如果
constexpr
函数模板或类模板的成员函数的实例化模板特化不能满足对constexpr
函数或constexpr
构造函数的要求,则即使对此类函数的调用不能出现在常量中,该特化仍为constexpr
函数或constexpr
构造函数。表达。如果在将模板视为非模板函数或构造函数时,如果模板的专业化不能满足对constexpr
函数或constexpr
构造函数的要求,则模板格式错误;无需诊断。
它是有效的constexpr
函数模板有一些特例不符合constexpr
要求的,也是有效的利用这些专长,只要他们不是用在需要常量表达式的上下文。
但是,如果模板的专业化不能满足constexpr
要求,那将是无效的。由于在一般情况下无法确定功能模板的所有可能实例化是否都不能满足constexpr
要求,因此该标准不需要诊断。因此,您的代码格式错误,不需要诊断-编译器可以但不要求报告错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句