结果括号中的括号是否在返回语句中显着?

Jos*_*lta 68 c c++ semantics

函数内的这两个语句之间有区别吗?

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引入decltypeC++语言规范中描述的说明符:

检查实体的声明类型或查询表达式的返回类型.

[剪断]

  1. 如果参数是对象/函数的未加特征化的名称,或者是成员访问表达式(object.member或pointer-> member),则decltype指定此表达式指定的实体的声明类型.

  2. 如果参数是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语义的变化.故事的道德 - "并非返回类型的所有括号都是平等的"

  • C++是一种非常有趣的语言.但是这些隐藏的"特征"有时让我疯狂...... (4认同)
  • 哇,这是多么可怕的语言.完全......不透明.不错的写作,谢谢. (3认同)

Kar*_*aen 6

没有区别.

使用括号的一个原因是,如果您想在返回之前评估表达式,但在您的示例中,没有理由.看到:

围绕返回值的括号

进一步讨论.

  • 虽然表达式复杂,但这些括号仍然不会导致不同的行为.它们只是让人类读者的意义更加明显(主观上!). (3认同)
  • @ChrisMiddleton不,因为这里的声明与该线程中的声明一样荒谬。return m * x + c和return(m * x + c)或return((m * x)+ c)等之间没有功能上的区别。如果您问我,则更好或更直观。 (2认同)

Jam*_*mes 5

上面例子的括号是多余的;他们实际上被忽略了。

就像...

int x = (5);
Run Code Online (Sandbox Code Playgroud)

这里的括号也被忽略。

  • +1…这是唯一说明括号实际上*冗余*并表明其用法有点愚蠢的答案。 (3认同)