如何解决在返回语句中,结果的括号是否有意义?
从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] 举报,一经查实,本站将立刻删除。