C++11添加了constexpr关键字,可以将该关键字添加到函数中以指定常量行为.
C23以[[Reducable]]标签的形式添加了看似相同的功能.
这两种机制有什么不同?
C++11添加了constexpr关键字,可以将该关键字添加到函数中以指定常量行为.
C23以[[Reducable]]标签的形式添加了看似相同的功能.
这两种机制有什么不同?
C++11添加了关键字
constexpr
,可以将其添加到函数中以指定常量行为.C23以[[Reducable]]标签的形式添加了看似相同的功能.
这两种机制有什么不同?
一般来说,C++(或C)constexpr
说明符比C[[reproducible]]
属性强得多,前者具有更广泛的语义和更强的约束.此外,constexpr
是程序语义的一部分,而[[reproducible]]
作为属性,充当编译器可以随意使用或不使用的可选元数据.[[reproducible]]
可以在不改变程序的有效性或语义的情况下自由删除,前提是没有定义[[reproducible]]
的函数不是从其范围内声明带有该属性的作用域调用的.
考虑到只适用于两种语言的方面,以下是一些更多细节:
对constexpr
个函数的调用可以出现在常量表达式中,这意味着可以在编译时计算它们.前者不适用于可复制函数,并且不必在编译时计算对可复制函数的调用.
C++constexpr
函数对其参数和返回类型有限制,而C可重现函数则没有限制.
在C++的某些版本中,constexpr
个函数对其定义中可以出现的语句类型(goto
、标签等)有限制,而C可重复使用的函数则没有限制.
在C++中,函数的定义和所有声明必须就它是否为constexpr
函数达成一致.在C语言中,用reproducible
属性定义的函数可以在没有它的情况下在任何翻译单元中安全地重新声明.
C++constexpr
函数不能写入非本地对象,也不能读取大多数非本地对象.C[[Reducable]]函数不受其可以读取哪些对象的限制.可重现函数可以通过作为参数提供给它的指针写入非本地对象.
每次调用带有相同参数的C++constexpr
函数都必须产生相同的返回值(如果有的话),而对于具有相同参数的可重现函数的两次调用只有在一个接一个执行的情况下才需要产生相同的返回值.
总的来说,constexpr
和[[reproducible]]
有一些大体相似之处,但它们具有非常不同的意义、效果和目的.它们离"完全相同"还差得远.另一方面,C23还将constexpr
引入C,其对象的语义与C++constexpr
非常相似.然而,在C中,constexpr
只能应用于对象,而不能应用于函数.