使用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;
}
答案 0 :(得分:7)
§7.1.5[dcl.constexpr] / p6:
如果实例化
constexpr
函数的模板特化 类模板的模板或成员函数将无法满足constexpr
函数或constexpr
的要求 构造函数,该特化仍然是constexpr
函数或constexpr
构造函数,即使对这样的函数的调用不能 出现在一个常量表达式中。如果没有专门化的模板 将满足constexpr
函数的要求或constexpr
构造函数,当被视为非模板函数或 构造函数,模板格式不正确;无需诊断。
constexpr
函数模板有一些不满足constexpr
要求的特殊化是有效的,并且只要它们不在需要的上下文中,它们就可以使用这些特化。不断表达。
但是,如果模板的专业化无法满足constexpr
要求,则无效。由于在一般情况下无法确定函数模板的所有可能实例化是否都不能满足constexpr
要求,因此该标准不需要诊断。因此,您的代码格式错误,无需诊断 - 编译器可以(但不是必须)报告错误。
答案 1 :(得分:2)
他们没有。你的测试有缺陷。
在您实际尝试实例化损坏的函数模板之前,不会检测到该问题。