C++ Lambda按引用捕获位域:标准与编译器差异及合规性问询
关于C++ Lambda引用捕获位域的标准与编译器行为分歧
根据cppreference的说明,位域(bit-fields)只能按值捕获。但存在如下场景:
struct U { int i : 4; }; constexpr int foo() { const auto & [y] = U{5}; return [&y = y]() { return y; }(); } static_assert( foo() == 5 );
在此场景中,GCC和Clang均允许在常量表达式求值期间按引用捕获位域。
请问是否存在cppreference未提及的例外情况,或是未来C++标准提案允许按引用捕获位域?
更新:捕获方式改为[&y]后的编译器分歧
若将Lambda表达式中的捕获替换为[&y]:
return [&y]() { return y; }();
此时不同编译器表现出现分歧:
- GCC与之前一致,接受该程序。
- MSVC拒绝编译,报错:
error C3693: 'y': bit-fields cannot be captured by reference
- Clang的表现介于两者之间,仅拒绝
foo()的常量求值,且报错无关。
内容的提问来源于stack exchange,提问作者Fedor
相关产品推荐
相关产品推荐

