Vit*_*meo 14 c++ lambda gcc clang c++14
我发现了使用多态C++ 14 lambdas(lambdas auto在其参数中)的奇怪行为:
小片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; }
Run Code Online (Sandbox Code Playgroud)
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的唯一区别在于autolambda 的内部被替换为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; }
Run Code Online (Sandbox Code Playgroud)
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; }
Run Code Online (Sandbox Code Playgroud)
clang ++ 3.5.1:代码片段编译并成功运行.
g ++ 4.9.2:代码片段编译并成功运行.
为什么g ++会抱怨代码片段0?我的代码有什么问题吗?这是一个已知的错误还是我应该提交?
| 归档时间: |
|
| 查看次数: |
404 次 |
| 最近记录: |