C++11/14 and return( ... ) vs return
C++11/14 and return( ... ) vs return
在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;
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 正在VS调试器中监视映射条目
- Confusion: decltype vs std::function
- 将IBM Rhapsody模型集成到VS 2019中
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 修改 VS Code 中的默认C++代码段
- 如何使用c++在VS 2019上运行SQL查询
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 完美前进使用 std::forward vs RefRefCast
- C++函数中的精确"return"矩
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- '[](std::list& list)<int>{return std::move(list)}(list)' 是否保证将 'list' 留空?
- 返回引用实例和非引用实例(return mystr & vs mystr)之间的区别是什么?
- C++11/14 and return( ... ) vs return