decltype(auto)类型推导:return x vs. return(x)

ein*_*ica 3 c++ decltype auto c++14 decltype-auto

我正在查看有关C ++ 14语言扩展isocpp.org常见问题解答,内容decltype(auto)如下:

...

注意: decltype(auto)如上所示,主要用于推导转发函数和类似包装的返回类型,在此情况下,您希望该类型精确“跟踪”正在调用的某些表达式。但是,除此以外,decltype(auto)并不打算被广泛使用。特别是,尽管它可以用来声明局部变量,但是这样做可能只是一个反模式,因为局部变量的引用性不应该依赖于初始化表达式。另外,它对如何编写return语句也很敏感。这两个函数具有不同的返回类型:

decltype(auto) look_up_a_string_1() { auto str = lookup1(); return str;  }
decltype(auto) look_up_a_string_2() { auto str = lookup1(); return(str); }
Run Code Online (Sandbox Code Playgroud)

第一个返回字符串,第二个返回字符串,string &它是对局部变量的引用str

我的问题:示例中的返回类型是否应该相反,我的意思是,括号应该形成一个表达式,其类型应该是非引用(或右值引用)?并且没有括号,说的str意思是“左值引用str”。我错了吗?

Sto*_*ica 6

是的,括号构成一个表达式。表达式永远不是引用类型。

如果表达式最初的类型为“对T的引用”([dcl.ref],[dcl.init.ref]),则在进行任何进一步分析之前,将类型调整为T。表达式指定由引用表示的对象或函数,并且表达式取决于表达式是左值还是x值。

“对T的引用”表示左值引用和右值引用。但是表达式确实具有值类别。str因为一个表达式是一个左值,所以也是如此,(str)因为括号保留了类型和值类别。

由于decltype在第二种情况下将应用于左值表达式,因此它将生成左值引用。

在第一种情况下,id表达式的特殊请求规则将返回“实体类型”,这是一种值类型。