在处理这个问题时,一个可能的答案暗示了嵌套的 lambda,其中内部的 lambda 隐式捕获了外部的
constexpr
局部变量。这是一个mre:
int main() {
[]() {
// must be declared static with msvc
constexpr int i = []() { return 42; }();
[]() { static_assert(i == 42); }();
}();
return 0;
}
直播 gcc 和 clang 都可以,但是 msvc 有问题
error C3493: 'i' cannot be implicitly captured because no default capture mode has been specified
。static
。
什么编译器是正确的以及为什么?
i
中的 i == 42
不是按照 [basic.def.odr]/5.2 的 odr 使用。非正式地,因为您在表达式中仅使用 i
的 值,而不是其作为对象的身份,并且该变量可在常量表达式中使用,即它的值是编译时已知的(因为该变量是声明的
constexpr
)。
因为
i
没有odr使用,所以不需要捕获它。