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

问题描述 投票:61回答:11

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

bool returnValue = true;

//Code that does something

return(returnValue);

还有这个?

bool returnValue = true;

//Code

return returnValue;

前者在returnValue周围有括号。

c++ c semantics
11个回答
96
投票

从C ++ 14开始,它们经常出现。

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))

在第一个func1返回int,在第二个func1返回int&。语义上的差异与周围的括号直接相关。

最新形式的auto说明符是在C ++ 11中引入的。在C++ Language Spec中它被描述为:

指定将从其初始化程序自动推导出声明的变量的类型。对于函数,指定返回类型是尾随返回类型,或者将从其返回语句推导出来(自C ++ 14起)

同样,C ++ 11引入了decltype中描述的C++ Language Spec说明符:

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

[剪断]

  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))

decltype(auto)允许函数中的尾随返回类型从return语句中的实体/表达式推导出来。在第一个版本中,return var1;实际上与返回类型decltype(var1)(上面的规则1的int返回类型)相同,而在第二个案例中return (var1);它实际上与decltype((var1))(规则2b的int &返回类型)相同。

括号使得返回类型为int&而不是int,从而改变了语义。故事的道德 - “并非返回类型的所有括号都是平等的”


0
投票

它们完全相同。我经常看到括号语法,我总是问那些使用它的人:为什么?没人能回答他们使用它的原因。

直截了当地说,返回表达式的括号被那些不完全掌握类函数宏和函数之间的区别的人使用,或者对C中的运算符优先级或评估规则的顺序感到困惑的人使用。没有编码样式受益于使用括号。

从而

return value;

比这更正确

return (value)

因为后者暗示你不太清楚你在做什么:)


-3
投票

在你的情况下两者都是一样的。


5
投票

没有区别。

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

Parenthesis surrounding return values

进一步讨论。


4
投票

AFAIK,没有什么不同。

在C ++中,表达式可以采用以下形式:expr(expr)。所以,后者是一个更多打字的表达。有关此内容的进一步阅读,请参阅a grammar(查找“表达式”)。


4
投票

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

它会像......一样

int x = (5);

这里的括号也被忽略了。


3
投票

不,你的代码没有区别。


3
投票

我认为boo是一个错字,你问的是否存在差异

return expr;

return(expr);

答案是不。


2
投票

不,两者之间没有区别,尽管如果它使表达式易于阅读和清除,你可以包括括号。


1
投票

没有不同!!

如果涉及复杂的表达,人们会使用括号。

BTW return是一个声明而非功能。


0
投票

你滥用编译器的速度很慢!

括号的存在不仅减慢了预处理阶段,而且它们也生成了更复杂的抽象语法树:更多的内存,更多的计算。


从语义的角度来看?它们完全相同。无论是否有括号,return语句将在返回之前完全评估表达式。

© www.soinside.com 2019 - 2024. All rights reserved.