【问题标题】:Accessing outer scope name in a lambda, is g++ or Visual or neither, right?在 lambda 中访问外部范围名称是 g++ 还是 Visual,或者两者都不是,对吧?
【发布时间】:2017-03-01 08:39:39
【问题描述】:

代码:

auto main() -> int
{
    int b = 42;
    auto lambasta = [&]()
    {
        using B_type = decltype( b );
        return B_type{};
    };
    (void) lambasta;
}

使用 MinGW g++ 6.3.0 -std=c++14 -Wall -pedantic-errors 编译时不进行诊断。使用 Visual C++ 2015 update 3 编译失败,

foo.cpp(6): 错误 C2065: 'b': 未声明的标识符

【问题讨论】:

  • 即使没有捕获 clagg/gcc Demo 也可以编译。
  • 捕获列表中的&b 有效吗?
  • @TheQuantumPhysicist:是的,显式捕获名称有助于 Visual C++ 理解它的存在。名称的实际 ODR 使用也是如此(在提及之前)。不幸的是,这不是我原来的问题的解决方法,其中名称出现在作为宏参数提供的表达式中。
  • 看起来它已在 MSVC 2017 RC 中修复(它也可以在没有捕获的情况下使用)。

标签: c++ lambda


【解决方案1】:

可能的解决方法:

template<typename T>
struct wrapper
{
    using wrapped_t = T;
};

auto main() -> int
{
    int b = 42;
    auto lambasta = [&, a = wrapper<decltype(b)>()]()
    {
        using B_type = typename decltype( a ) ::wrapped_t;
        return B_type{};
    };
    (void) lambasta;
}

适用于 GCC 6.3 和 MSVC 2015 up 3

【讨论】:

    猜你喜欢
    • 2011-03-14
    • 2016-08-27
    • 2012-02-17
    • 1970-01-01
    • 2018-09-14
    • 2017-09-09
    • 1970-01-01
    • 2020-04-17
    • 2012-02-11
    相关资源
    最近更新 更多