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

Dan*_*iel 2 c++ templates constexpr c++14

使用C++ 14.为什么这会编译:

template<unsigned N>
constexpr bool foo()
{
    std::array<char, N> arr;
    return true;
}
Run Code Online (Sandbox Code Playgroud)

但不是吗?

constexpr bool foo()
{
    std::array<char, 10> arr; // Non-constexpr constructor 'array' cannot be used in a constant expression
    return true;
}
Run Code Online (Sandbox Code Playgroud)

T.C*_*.C. 7

§7.1.5[dcl.constexpr]/p6:

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

它是有效的constexpr函数模板有一些特例不符合constexpr要求的,也是有效的,只要他们不是用在需要常量表达式上下文来使用这些专业.

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

  • @ 0x499602D2它定义了一个类型为`std :: array <char,N>`的变量,没有执行初始化. (2认同)