可能的 gcc 错误与 C++14 多态 lambda

Possible gcc bug with C++14 polymorphic lambdas?

本文关键字:C++14 多态 lambda 错误 gcc      更新时间:2023-10-16

我发现了使用多态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:代码片段编译并成功运行。

G++ 4.9.2:代码段编译失败:

示例.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?我的代码有什么问题吗?这是一个已知的错误还是我应该提交这个?

如评论中所述,这种行为确实是一个 gcc 错误。