【问题标题】:Possible gcc bug with C++14 polymorphic lambdas?C++14 多态 lambda 可能存在 gcc 错误?
【发布时间】:2015-03-31 15:00:11
【问题描述】:

我发现使用多态 C++14 lambda(参数中带有 auto 的 lambda)的奇怪行为:


片段 0:

#include <iostream>

template<typename T> void doLambda(T&& mFn)
{
  std::forward<T>(mFn)(int{0});
}

template<typename T> void test(T&& mV)
{
    doLambda([&mV](auto mE)
    {
        std::forward<decltype(mV)>(mV);
    });
}

int main() { test(int{0}); return 0; }

clang++ 3.5.1:sn-p编译运行成功。

g++ 4.9.2:sn-p 编译失败:

example.cpp:在'test(T&amp;&amp;)::&lt;lambda(auto:1)&gt; [with auto:1 = int; T = int]'的实例化中:

5 : 来自'void doLambda(T&amp;&amp;) [with T = test(T&amp;&amp;) [with T = int]::]'
13 : 需要来自'void test(T&amp;&amp;) [with T = int]'
18:从这里需要
12:错误:'mV' 未在此范围内声明

std::forward&lt;decltype(mV)&gt;(mV);
^

编译失败


片段 1:

与 sn-p 0 的唯一区别是 lambda 中的 auto 被替换为 int

#include <iostream>

template<typename T> void doLambda(T&& mFn)
{
  std::forward<T>(mFn)(int{0});
}

template<typename T> void test(T&& mV)
{
    doLambda([&mV](int mE)
    {
        std::forward<decltype(mV)>(mV);
    });
}

int main() { test(int{0}); return 0; }

clang++ 3.5.1:sn-p编译运行成功。

g++ 4.9.2:sn-p编译运行成功。


片段 3:

现在就地调用 lambda。 auto 仍在使用中。

#include <iostream>

template<typename T> void test(T&& mV)
{
    [&mV](auto mE)
    {
        std::forward<decltype(mV)>(mV);
    }(int{0});
}

int main() { test(int{0}); return 0; }

clang++ 3.5.1:sn-p编译运行成功。

g++ 4.9.2:sn-p编译运行成功。


为什么 g++ 抱怨 sn-p 0? 我的代码有什么问题吗?这是一个已知的错误还是我应该提交这个?

【问题讨论】:

  • GCC on Coliru复制
  • 显然是一个错误。不会在 trunk 上重现,所以我猜它已经修复了。
  • @T.C.您能否发表您的评论作为答案,以便我接受?
  • 似乎是这个错误 - gcc.gnu.org/bugzilla/show_bug.cgi?id=61814 Jonathan Wakely 最后评论中的示例现在在主干上编译。

标签: c++ gcc lambda clang c++14


【解决方案1】:

如 cmets 中所述,此行为 is indeed a gcc bug

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 2014-10-26
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多