C ++ 14多态lambda可能存在gcc错误?

时间:2015-02-01 15:56:43

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

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


代码段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 :代码段编译并成功运行。

g ++ 4.9.2 :代码段无法编译:

  

example.cpp:实例化'test(T&&)::<lambda(auto:1)> [with auto:1 = int; T = int]'

     

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

     

std::forward<decltype(mV)>(mV);
  ^

     

编译失败


代码段1:

与代码段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 :代码段编译并成功运行。

g ++ 4.9.2 :代码段编译并成功运行。


摘录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 :代码段编译并成功运行。

g ++ 4.9.2 :代码段编译并成功运行。


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

1 个答案:

答案 0 :(得分:1)

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