C++ 11/14并返回(...)vs return

use*_*710 3 c++ decltype c++11 type-deduction c++14

C++中,您可以编写一个返回语句,如下所示:

return ( ... );
Run Code Online (Sandbox Code Playgroud)

这与更受欢迎的不同:

return ... ;
Run Code Online (Sandbox Code Playgroud)

特别是第一个版本返回包含该return语句的函数堆栈本地的东西的地址/引用.

既然为什么某些东西想要返回一个对那些在那时没有生命的东西的引用呢?

这个成语有什么用例?考虑到C++ 11和C++ 14的新流行语和功能,有不同的用法吗?

sp2*_*nny 12

表单是return expression;
Expression可以是任何东西,包括带括号的表达式.
这些都不是不同形式的回报,然而,一起
decltype(auto)不同的类型会被推导出来.

  • @Csq因为你决定不解释为什么答案明显不正确?有问题的表达式确实不同,但它们与`return`本身的形式相同.答案是不完整的,但我不知道它在哪里**不正确**. (4认同)
  • 我想知道为什么当这个答案显然是不正确的时候,这个被提升为+7. (2认同)

Nik*_*iou 10

当在C++ 14中使用自动返回类型推导时,这两个版本的上下文不同decltype(auto)

特别是第二个是案例B中的反模式(例子来自C++ FAQ)

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

因为它返回string&(而不是string在A中),它是对局部变量str 的引用.


Sha*_*our 8

C++ 1y 返回的括号版本是相同的,如果我们看一下C++ 11草案标准部分的6.6 Jump语句,返回的语法是:

返回表达式opt ;

return braced-init-list;

一个表达式可以是任意的表达,我们可以从部分看5.1 基本表达式说(重点矿山前进):

带括号的表达式是一个主表达式,其类型和值与所包含表达式的类型和值相同.括号的存在不会影响表达式是否为左值. 除非另有说明,否则带括号的表达式可以在与可以使用所包含的表达式的上下文完全相同的上下文中使用,并且具有相同的含义.

C++ 1y中,我们可以使用delctype(auto)来推断返回类型,这可以改变这种情况,正如我们从草案C++ 1y标准部分7.1.6.4 自动说明符中所看到的那样:

当初始化使用占位符类型声明的变量,或者在使用包含占位符类型的返回类型声明的函数中发生return语句时,推导的返回类型或变量类型由其初始化程序的类型确定.[... ]

并包含以下示例:

auto x3a = i; // decltype(x3a)是int

decltype(auto)x3d = i; // decltype(x3d)是int

auto x4a =(i); // decltype(x4a)是int

decltype(auto)x4d =(i); // decltype(x4d)是int&

我们可以看到使用delctype(auto)和带括号的表达式时有区别.正在应用的规则来自7.1.6.2 简单类型说明符4段,其中说:

对于表达式e,由decltype(e)表示的类型定义如下:

并包括以下项目符号:

- 如果e是未表示的id-expression或未加密的类成员访问(5.2.5),则decltype(e)是e命名的实体的类型.如果没有这样的实体,或者如果e命名了一组重载函数,那么该程序就会形成错误;

和:

- 否则,如果e是左值,则decltype(e)是T&,其中T是e的类型;