相关疑难解决方法(0)

了解 constexpr 变量初始化的完整表达式

以下程序可以在所有主要编译器上成功编译:

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 }其中 …

c++ language-lawyer constexpr

7
推荐指数
1
解决办法
303
查看次数

标签 统计

c++ ×1

constexpr ×1

language-lawyer ×1