C++11/14 and return( ... ) vs return

C++11/14 and return( ... ) vs return

本文关键字:return vs and C++11      更新时间:2023-10-16

C++中,您可以编写一个返回语句,看起来像:

return ( ... );

与更流行的不同

return ... ;

特别地,第一个版本返回某个内容的地址/引用,该内容是包含该return语句的函数堆栈的本地内容。

现在,为什么有些东西想要返回一个引用,在那一点上,没有生命?

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

形式为return expression;
表达式可以是任何内容,包括带括号的表达式
这些回报形式并没有什么不同,但它们加在一起
对于CCD_ 3,将推导出不同的类型。

当在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

因为它返回string&(与a中的string相反(,这是对局部变量str.

的引用

PreC++1y返回的带括号版本是相同的,如果我们查看C++11标准草案6.6跳转语句return的语法为:

return表达式opt

返回支持的init列表;

表达式可以是任何表达,我们可以从5.1一节中看到主要表达式says(emphasis mine forward(:

带括号的表达式是其类型和值与所附表达式的值相同。出席括号的大小不会影响表达式是否为左值。带括号的表达式可以在完全相同的上下文中使用与那些可以使用封闭表达式的地方一样含义,除非另有说明

C++1y中,我们可以使用delctype(auto(来推导返回类型,这改变了情况,正如我们从C++1y标准草案7.1.6.4自动说明符所说:

当使用占位符类型声明的变量被初始化时,或者return语句出现在用返回类型声明的函数中包含占位符类型,推导的返回类型或变量类型由其初始值设定项的类型确定。[…]

并包含以下示例:

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

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

自动x4a=(i(;//decltype(x4a(是int

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

我们可以看到,当使用delctype(auto(和带括号的表达式时存在差异。应用的规则来自第7.1.6.2节简单类型说明符4段,其中写道:

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

包括以下项目符号:

--如果e是未加括号的id表达式或未加括号类成员访问(5.2.5(,decltype(e(是由e.如果没有这样的实体,或者如果e命名了一组重载的函数,程序格式错误;

和:

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