在MSVC下,对带有consteval构造函数的成员使用具名初始化时出现编译错误

编程语言 2026-07-10

请看下面这段代码

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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章