MSVC初始化列表中无法用consteval函数:代码问题还是编译器Bug?
代码无语法错误,属于MSVC编译器Bug
先看问题中的代码片段:
#include <vector> class Bar { public: constexpr Bar() {} }; consteval Bar foo() { return Bar(); } int main() { std::vector<Bar> bars{ foo(), foo() }; }
这段代码完全符合C++20标准要求,不存在语法错误,无法在MSVC 2022 17.3.3版本编译是编译器的实现缺陷(Bug)。
核心分析:
consteval函数的核心要求是调用必须是常量表达式求值的一部分,但这并不限制其返回值只能用于常量初始化场景。- 在此代码中:
foo()作为consteval函数,其内部返回Bar对象的操作满足常量表达式要求(Bar的构造函数是constexpr);- 在
std::vector的初始化列表中调用foo(),本质是用常量表达式生成的Bar临时对象,来初始化vector的元素——这是标准允许的合法操作。
Clang和GCC的最新版本都正确识别了这一合法用法,而MSVC错误地判定该consteval调用不符合常量表达式上下文要求,属于编译器实现上的Bug。
内容的提问来源于stack exchange,提问作者prapin
相关产品推荐
相关产品推荐

