微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在返回语句中,结果的括号是否有意义?

如何解决在返回语句中,结果的括号是否有意义?

从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&。语义上的差异与周围的括号直接相关。

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

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

括号使返回类型int&代替int,从而改变了语义。故事的寓意-“并非所有返回类型的括号都相等”

解决方法

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

bool returnValue = true;
// Code that does something
return(returnValue);

还有这个?

bool returnValue = true;
// Code
return returnValue;

前者周围有括号returnValue

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。