【发布时间】:2021-10-08 08:51:36
【问题描述】:
我有以下代码
decltype(auto) foo(){
int a = 10;
return a;
}
我本来希望 foo 的类型是
int & foo()
因为 a 是一个左值,而 decltype(a) 是一个引用。
如果我做了非常相似的事情,但用完美的转发 lambda 混淆了它,我会得到不同的结果。
// perfect forwarding lambda
auto identity = [](auto&& i) -> decltype(auto) { return std::forward<decltype(i)>(i); };
decltype(auto) foo(){
int a = 10;
return identity(a);
}
foo的返回类型变成int&
谁能告诉我这里发生的事情的确切规则?
【问题讨论】:
-
在没有 identity 函数的情况下,foo 的返回类型是
int,而对于完美的转发 lambda,它是int & -
即使
foo的返回类型是引用,这也会使您返回对局部变量的引用,该变量的生命周期在函数返回时结束,使引用立即无效。 -
decltype在应用于 id-expression 时具有特殊含义。 Cf.:decltype(x)和decltype((x)). -
decltype(a)是int,而不是int&。要获得int&,您必须将a括在括号中decltype((a))为您提供int&。 -
@bradgonesurfing 对不起,我看错了你的问题。
标签: c++ decltype perfect-forwarding decltype-auto