为什么模板允许constexpr函数成员使用非constexpr构造函数?

时间:2014-10-26 01:04:22

标签: c++ templates c++14 constexpr

使用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;
}

2 个答案:

答案 0 :(得分:7)

§7.1.5[dcl.constexpr] / p6:

  

如果实例化constexpr函数的模板特化   类模板的模板或成员函数将无法满足   constexpr函数或constexpr的要求   构造函数,该特化仍然是constexpr函数或   constexpr构造函数,即使对这样的函数的调用不能   出现在一个常量表达式中。如果没有专门化的模板   将满足constexpr函数的要求或   constexpr构造函数,当被视为非模板函数或   构造函数,模板格式不正确;无需诊断。

constexpr函数模板有一些不满足constexpr要求的特殊化是有效的,并且只要它们不在需要的上下文中,它们就可以使用这些特化。不断表达。

但是,如果模板的专业化无法满足constexpr要求,则无效。由于在一般情况下无法确定函数模板的所有可能实例化是否都不能满足constexpr要求,因此该标准不需要诊断。因此,您的代码格式错误,无需诊断 - 编译器可以(但不是必须)报告错误。

答案 1 :(得分:2)

他们没有。你的测试有缺陷。

在您实际尝试实例化损坏的函数模板之前,不会检测到该问题。

相关问题