我学习过c++中的constexpr
变量,读到int i =0; constexpr int j = i;
失败是因为i
不是常量表达式,这是有意义的,但是当我对类的变量做同样的操作时,它成功了。
struct C{};
int main()
{
int i = 0; //i is not a constant expression as expected
//constexpr int j = i; //this fails AS EXPECTED
C c;
constexpr C d = c; //WHY DOESN'T THIS FAIL??
}
正如您所看到的,constexpr C d = c;
与constexpr int j = i;
不同,即使c
也不是一个常量表达式,constexpr C d = c;
也不会出现任何编译问题。
我想知道这背后的原因。
2条答案
按热度按时间v440hwme1#
我想知道这背后的原因。
因为类
C
有一个隐式的constexpr
复制构造函数constexpr C::C(const C&)
,可以像这样在constexpr上下文中使用。基本上,初始化
constexpr C d = c;
是一个 *constexpr上下文 *,constexpr函数正是为此目的而设计的。通过查看cppinsights中生成的代码,您也可以看到这一点:
正如我们在上面生成的代码中看到的,
C
隐式声明了可以在constexpr上下文中使用的constexpr
构造函数。从constexpr开始:
constexpr变量必须满足以下要求:
*其初始化的完整表达式(包括所有隐式转换、构造函数调用等)必须是常量表达式
ecbunoof2#
它是有效的,因为
d
的初始化不依赖于c
的 * 值 *,因为c
不包含运行时存在的数据。您可以在以下位置找到常量表达式的要求列表: