gpt4 book ai didi

C++ - 我可以创建编译时变量对象吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:37 25 4
gpt4 key购买 nike

我最近在使用 constexpr,但我才意识到我用错了。我很好奇我是否可以创建一个编译时变量(或变量对象)。
来自 cppreference.com 的 constexpr 定义告诉我们:

The constexpr specifier declares that it is possible to evaluate the value of the function or variable at compile time.

那么为什么下面的代码不正确?

#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,但我要问:为什么这样?现代编译器应该能够在编译时推断出它的值(value)。另外,我知道我可以简单地创建另一个 constexpr 常量(广告。最上面的代码示例),但我的问题涉及更复杂的代码。

最佳答案

So why is following code incorrect?

#include <iostream>

int main()
{
constexpr int x = 30;
x += 10;
std::cout << x;
}

constexpr 表示 const。您需要将其限制在 constexpr 上下文中:

constexpr int foo() {
int x = 30;
x += 10;
return x;
}

But what if I want to have a compile-time object?

#include <iostream>

class ctFoo {
public:
ctFoo()
: value{ 0 }
{
}
int accumulate(int value_) {
return (value += value_), value;
}
int value;
};

给它 constexpr 支持:

constexpr ctFoo() : value{ 0 }

constexpr int accumulate(int value_) {
value += value_;
return value;
}

您现在拥有的保证是,如果您的 ctFoo 对象是一个常量表达式并且您在 constexpr 上下文中调用 accumulate,例如 foo 函数示例,那么您可以在编译时使用结果。例如:

constexpr int foo() {
ctFoo f;
f.accumulate(10);
return f.value;
}

static_assert(foo() == 10);

或者:

constexpr void accumulate(ctFoo& f) {
f.accumulate(10);
}

constexpr int foo() {
ctFoo f;
accumulate(f);
return f.value;
}

static_assert(foo() == 10);

这里要记住的关键是运行时评估也是一个选项。如果我将某些 ctFoovalue 设置为运行时值(例如,用户输入),则 accumulate 调用不可能发生在编译时。但这没关系 - 相同的代码在两种情况下都有效。

关于C++ - 我可以创建编译时变量对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48130611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com