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

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

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

从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,从而改变了语义。故事的寓意-“并非所有返回类型的括号都相等”



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5094236.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-16

发表评论

登录后才能评论

评论列表(0条)

保存