最近我使用了constexpr,但我意识到我使用它的方式是错误的。我想知道是否可以创建一个编译时变量(或变量对象)。来自cppreference.com的constexpr定义告诉我们:
constexpr说明符声明函数或变量的值可以在编译时评估。
那么为什么以下代码是不正确的?
constexpr说明符声明函数或变量的值可以在编译时评估。
那么为什么以下代码是不正确的?
#include <iostream>
int main()
{
constexpr int x = 30;
x += 10;
std::cout << x;
}
这个整数可以在编译时完美地评估。我知道编译器可以优化这样的变量而不需要constexpr修饰符,但如果我想要一个编译时对象呢?
#include <iostream>
class ctFoo {
public:
ctFoo()
: value{ 0 }
{
}
int accumulate(int value_) {
return (value += value_), value;
}
int value;
};
int main()
{
ctFoo foo;
std::cout << foo.accumulate(100);
}
我想知道这段代码将在编译时被评估的确定性有多大?
我问这个问题是因为我正在编写一些Vector2和Vector3数学代码,并且我希望创建这样的实现,可以处理编译时和运行时计算。这是否可能?
谢谢。
编辑
正如max66指出的那样,constexpr意味着const,但我想问的是:为什么会这样?现代编译器应该能够在编译时推导出它的值。 此外,我知道我可以简单地创建另一个constexpr常量(例如顶部代码示例),但我的问题涉及更复杂的代码。
constexpr
中加入const
了。 - max66constinit
。 - Tellegar