【发布时间】:2022-01-03 06:27:18
【问题描述】:
GCC 和 MSVC 似乎都允许为非常量数据成员定义 constexpr 访问器函数:
#include <random>
#include <iostream>
class Foo
{
int val;
public:
Foo(int v) : val(v) {}
constexpr int get_val() { return val; } // OK
};
int main()
{
std::random_device rd;
Foo foo((int)rd());
std::cout << foo.get_val(); // works
}
这是来自 MSVC 和 GCC 的非标准行为,还是标准实际上允许这样做?
【问题讨论】:
-
constexpr不需要在编译时评估函数。更多的是constexpr-preserving——如果输入是常量表达式,那么输出也是常量表达式。在这种情况下,这意味着您可以在constexpr Foo上调用get_val,但没有什么能阻止您在其他时间调用它。 (实际上,不能在constexpr Foo上调用此特定函数,除非它同时是constexpr和const,但您可以在constexpr上下文中调用它。) -
很有趣,所以 constexpr 要求更多的是它必须可能在编译时在给定适当输入的情况下进行评估?
标签: c++ gcc visual-c++ constexpr