以下程序可以在所有主要编译器上成功编译:
struct S {
constexpr S(const S&){};
constexpr S() = default;
};
int main(void) {
S s1{};
constexpr S s2{ s1 };
}
Run Code Online (Sandbox Code Playgroud)
控制变量初始化的规则constexpr是[dcl.constexpr]/10:(强调我的)
对象声明中使用的说明符
constexpr将该对象声明为 const。这样的对象应具有文字类型并应进行初始化。在任何constexpr变量声明中,初始化的完整表达式应为常量表达式 (7.7)。变量constexpr应不断被破坏。
根据粗体部分,初始化的完整表达式应为常量表达式。根据我的理解,这里的完整表达式是init-declarator per [into.execution]/5:
完整的表达式是
- [..] (5.4) 一个初始化声明符 ([dcl.decl]) [..]
根据init-declarator的语法,init-declarator是一个声明符,后跟一个初始化器:
init-declarator:
declarator initializer
Run Code Online (Sandbox Code Playgroud)
有了这些信息,我们可以得出结论,初始化的完整表达式constexpr S s2{ s1 };是s2{ s1 }其中 …