constexpr Lambda在MSVC编译通过但GCC/Clang报错,哪个符合标准?
问题解答
结论
GCC和Clang的编译行为符合C++标准,MSVC允许代码编译属于非标准扩展。
原因分析
根据C++标准的lambda捕获规则:
- 对于自动存储期的局部变量(比如代码中
main函数内定义的func),如果在lambda表达式中被odr-used(即需要访问变量实体,比如调用其成员函数、取地址等),必须显式捕获该变量(值捕获、引用捕获或使用捕获默认均可)。 - 代码中
func()是调用lambda对象func的函数调用运算符,属于对func的odr-used操作,因此必须捕获func才能在lambda中使用。
GCC给出的错误提示准确指出了问题:lambda没有设置捕获默认,且未显式捕获func,违反了标准规则。而MSVC的编译通过是其自身的非标准扩展行为,不符合C++标准要求。
修正后的代码示例
要让代码符合标准,只需显式捕获func即可,比如:
int main() { constexpr auto func = []()constexpr { return 1; }; auto i = [func]{return func();}; // 值捕获 }
也可以使用引用捕获或捕获默认的写法,同样符合标准。
内容的提问来源于stack exchange,提问作者user20562802
相关产品推荐
相关产品推荐

