【发布时间】:2018-12-11 05:30:06
【问题描述】:
#include <type_traits>
#include <utility>
int main()
{
auto f1 = [](auto&& e) -> auto
{
return e;
};
auto f2 = [](auto&& e) -> auto&
{
return e;
};
auto f3 = [](auto&& e) -> auto&&
{
return e;
};
auto f4 = [](auto&& e) -> decltype(auto)
{
return e;
};
int n{};
f1(std::move(n)); // ok
f2(std::move(n)); // ok
f3(std::move(n)); // ok
f4(std::move(n)); // error
}
clang 的错误信息:
错误:对“int”类型的右值引用无法绑定到“int”类型的左值
对我来说,decltype(auto) 只有三种可能的推导类型:
autoauto&auto&&
为什么f4 出错而其他三个都正常?
【问题讨论】:
-
该错误来自 Clang。 GCC 似乎接受了它。我猜这是一个 Clang 错误。
-
decltype(auto)的返回类型表示return e;导致返回类型为decltype(e),即int&&对应f4 -
@M.M 为什么
f3可以,而f4不行? -
@xmllmx
auto&&在f3(std::move(n))调用的实例化中推导出int&,e可以初始化int&
标签: c++ lambda c++14 decltype type-deduction