Kno*_*abe 9 c++ constexpr c++11
如果声明了一个对象const
,则保证其值仅在运行时可用,但如果声明constexpr
了该值,则保证该值在编译期间和运行时都可用.因此,如果我有一个在编译期间值可用的对象,是否有任何我不应该声明它的情况constexpr
?
const int magicValue = 42; // Does this ever make sense
// (using const instead of constexpr)?
Run Code Online (Sandbox Code Playgroud)
对于函数,如果函数可以返回编译期间计算的值,当在编译期间传递带有值的参数时,是否有意义不声明函数constexpr
?
struct Point { int x; int y; };
Point midPoint(Point p1, Point p2) // Does this ever make
{ // sense (not declaring
return { (p1.x + p2.x) / 2 , (p1.y + p2.y) / 2 }; // the function
} // constexpr)?
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一情况是当你不想提交能够在使用known-at-compile-time参数调用时计算编译时常量的函数,例如,如果你想保持灵活性改变midPoint
实现而不改变其界面(从而可能破坏调用者).例如,您可能希望保留将非constexpr
副作用添加到midPoint
例如IO 的灵活性.
对于变量,我认为没有任何理由不使用constexpr
。但并不总是可以这样做,例如当变量的初始值设定项由虚函数计算时,例如
添加constexpr
到函数是一个接口更改:您正在表达可以使用它来初始化变量的事实constexpr
。这对函数的实现施加了限制,例如不能调用虚函数、不能动态内存分配以及不能将 lambda 函数作为函数对象。
请注意, LWG 问题 2013 的解决方案不允许标准库的实施者自由添加constexpr
库函数。原因之一是声明函数constexpr
可能会抑制某些进行动态分配的调试实现(尤其是迭代器检查)。这意味着未来constexpr
对标准库的扩展需要单独提出。这与图书馆编写者拥有更多自由相反noexcept
。
归档时间: |
|
查看次数: |
316 次 |
最近记录: |