从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,从而改变了语义。故事的寓意-“并非所有返回类型的括号都相等”
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)