函数内的这两个语句之间有区别吗?
bool returnValue = true;
// Code that does something
return(returnValue);
Run Code Online (Sandbox Code Playgroud)
还有这个?
bool returnValue = true;
// Code
return returnValue;
Run Code Online (Sandbox Code Playgroud)
前者有括号returnValue.
Mic*_*tch 103
C++ 14增加了一个边缘情况,其中返回值周围的括号可能会改变语义.此代码段显示了声明的两个函数.唯一的区别是返回值周围的括号.
int var1 = 42;
decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1)
decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))
Run Code Online (Sandbox Code Playgroud)
在第一个func1返回中int,在第二个func1返回一个int&.语义上的差异与周围的括号直接相关.
auto最新形式的说明符是在C++ 11中引入的.在C++语言规范中,它被描述为:
指定将从其初始化程序自动推导出声明的变量的类型.对于函数,指定返回类型是尾随返回类型,或者将从其返回语句推导出来(自C++ 14起)
同样,C++ 11引入decltype了C++语言规范中描述的说明符:
检查实体的声明类型或查询表达式的返回类型.
[剪断]
如果参数是对象/函数的未加特征化的名称,或者是成员访问表达式(object.member或pointer-> member),则decltype指定此表达式指定的实体的声明类型.
如果参数是T类型的任何其他表达式,那么
a)如果表达式的值类别是xvalue,则decltype指定T &&
b)如果表达式的值类别是左值,则decltype指定T&
c)否则,decltype指定T.
[剪断]
请注意,如果对象的名称带括号,则它变为左值表达式,因此decltype(arg)和decltype((arg))通常是不同的类型.
在C++ 14中,decltype(auto)允许使用函数返回类型.最初的例子是与括号的语义差异发挥作用的地方.重温原始示例:
int var1 = 42;
decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1)
decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))
Run Code Online (Sandbox Code Playgroud)
decltype(auto)允许函数中的尾随返回类型从return语句中的实体/表达式推导出来.在第一个版本return var1;实际上与返回类型decltype(var1)(int上面的规则1 的返回类型)相同,而在第二个案例中,return (var1);它实际上与decltype((var1))(int &规则2b 的返回类型)相同.
括号表示返回类型,int&而不是int语义的变化.故事的道德 - "并非返回类型的所有括号都是平等的"
上面例子的括号是多余的;他们实际上被忽略了。
就像...
int x = (5);
Run Code Online (Sandbox Code Playgroud)
这里的括号也被忽略。