有没有应该避免constexpr的情况,即使它可以使用?

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 的灵活性.

Tem*_*Rex 4

对于变量,我认为没有任何理由不使用constexpr。但并不总是可以这样做,例如当变量的初始值设定项由虚函数计算时,例如

添加constexpr到函数是一个接口更改:您正在表达可以使用它来初始化变量的事实constexpr。这对函数的实现施加了限制,例如不能调用虚函数、不能动态内存分配以及不能将 lambda 函数作为函数对象。

请注意, LWG 问题 2013 的解决方案不允许标准库的实施者自由添加constexpr库函数。原因之一是声明函数constexpr可能会抑制某些进行动态分配的调试实现(尤其是迭代器检查)。这意味着未来constexpr对标准库的扩展需要单独提出。这与图书馆编写者拥有更多自由相反noexcept