以下代码在GCC,Clang和MSVC上编译:
struct Foo {
int x;
};
struct Bar: Foo {
decltype(x) z;
};
但是这个不能用MSVC编译:
struct Foo {
int x;
};
auto m = [] () {
struct Bar: Foo {
decltype(x) z;
};
};
错误是:
错误C4573:使用' Foo :: x'要求编译器捕获这个'但目前的默认捕获模式不允许它
对我来说这似乎是错的...所以我想知道这是否是MSVC错误或者这是否是gcc / clang的扩展?
在所有情况下,是否有另一种方法可以执行我想要的操作而无需在x
内加decltype(Foo::x)
Bar
}前缀?
注意:编写this answer时会出现原始问题,我基本上想要执行以下操作以避免在宏中生成名称:
auto something = [] () {
struct: Foo {
decltype(x) z;
auto operator()() { return z; }
} foo;
return foo.operator();
}();
目前我正在使用结构,所以我必须做类似的事情:
MACRO(Foo, x) my_var;
// or... MACRO(my_var, Foo, x);
auto value = my_var();
但我想:
auto value = MACRO(Foo, x);
答案 0 :(得分:1)
这似乎是一个编译器错误。
这是VC ++ 19.00.23506,rextester.com上的版本
最新的VC ++编译器,版本为19.00.24213
,修复了这个问题。
显然在VC ++中使用lambda内的decltype
带来some issues detecting type from out of scope。
明确地告诉编译器Foo::x
可能是一种解决方法,因为你已经弄明白了。