为什么C++不能自动判断何时使用constexpr而不让我们编写标签?

3
Scott Meyer的《现代C++》一书中的第15项建议:“尽可能使用constexpr”。他说,您可以将函数标记为constexpr,并仍然使用在编译时未知的值进行调用--在这种情况下,它将像任何其他运行时函数一样运行,因此如果可能获得编译时计算的好处,但仍然可以使用非编译时值。编译器会自动处理。
但是,如果这是真的,那么为什么我们不能给每个函数都打上constexpr标签(或者更好的方法是不打任何标签,让编译器始终自动处理)呢?如果编译器能够检测值是否在编译时已知,并在我将该方法标记为constexpr时自动执行正确的操作,那么为什么它不能在我不编写constexpr时自动执行同样的检查呢?

1
constexpr 仅适用于不依赖于任何运行时状态的函数。 - SLaks
1
我认为这与普通的const的原因相同,它是你的接口的一部分。如果我对一个被声明为const的函数进行更改,试图修改状态,那么我会得到编译器错误。constexpr也是同样的道理,我在说“这应该是constexpr”。可能还有其他(更有效的)原因,但这是我能想到的一个。 - Borgleader
1个回答

0

...当函数接收到在编译时不知道的值时,你不能将函数标记为constexpr。如果其计算依赖于指针或全局值等,则也不能将函数标记为constexpr

如果该函数的body可以在编译时执行,则可以将其标记为constexpr,但仍然可以使用运行时值调用它。例如,用于计算参数化类的静态常量值,使用传递的编译时值作为参数,但也可以通过std::cin获取其参数后计算用户值。

尽可能地

...如果函数体使用I/O操作、非const全局/静态/-成员)值、地址或volatile等,则无法实现。


不,那不是真的。即使函数依赖于指针或全局值,您肯定可以将其标记为constexpr。(然后constexpr将无用,因为所有内容都在运行时计算,但它可以编译和运行良好)。但是这个也可以编译通过:“constexpr int f(int* y) { return *y; }” - user2543623

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接