使用父成员在MSVC上的lambda内部工作的decltype

时间:2016-08-19 09:52:40

标签: c++ visual-c++ c++14

以下代码在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);

1 个答案:

答案 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可能是一种解决方法,因为你已经弄明白了。