在MSVC下,对带有consteval构造函数的成员使用具名初始化时出现编译错误
请看下面这段代码
struct ConstEval {
consteval ConstEval(int x) : a{ x } {}
int a;
};
struct HasConstEval {
ConstEval ceval;
};
int main()
{
HasConstEval x{
.ceval = 1
};
}
这段代码在clang18、gcc14下可以编译,但在MSVC工具集143上无法编译。问题出在指定的初始化器
.ceval = 1
导致如下结果
error C7595: 'ConstEval::ConstEval': call to immediate function is not a constant expression
我不明白这是怎么回事:HasConstEval 可以在编译时就被构造。给 HasConstEval 增加一个构造函数并调用它(例如通过移除指定的初始化)也能让程序在MSVC上编译通过。
标准中对指定初始化器有相关规定吗,还是这属于MS标准库或MS编译器的问题?
解决方案
可能的变通办法,以便在修复该问题并升级你的编译器之前解决问题:
int main()
{
static constexpr auto x = ConstEval{1};
[[maybe_unused]]HasConstEval y{
.ceval = x
};
}
https://godbolt.org/z/qWoTE6xed
看起来MSVC似乎是在创建一个临时对象,而不是在编译时直接实例化它,然后再把它作为参数使用。
在上述变通方法中,静态的编译时常量是被显式实例化的。
此外,使用具名常量是一个好习惯。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。