微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我们如何理解 constexpr 的“如果可能”

如何解决我们如何理解 constexpr 的“如果可能”

我已阅读有关 constexpr链接https://en.cppreference.com/w/cpp/language/constexpr

它表示 constexpr 说明符声明可以在编译时评估函数或变量的值。

据我所知,这意味着 constexpr 指定的变量可能会或可能不会在编译时被评估。

This link 告诉我同样的事情:constexpr 变量不是编译时值。

然而,我做了一个测试,这让我很困惑:https://godbolt.org/z/9ajb4xKK8

如您所见,变量 a 必须在编译时求值,否则不能用于声明数组。并且 s 不能指定变量 constexpr,因为在编译时无法调用 std::string 的构造函数

总之,这个测试似乎告诉我 constexpr 必须在编译时评估该值。不然怎么用变量a来声明一个数组?

我误解了什么?

编辑

我知道可以在运行时或编译时调用 constexpr 函数。例如,如果我们将运行时参数传递给 constexpr 函数,该函数将在运行时被调用,我理解这一点。

但似乎必须在编译时评估 constexpr 变量。我可以说任何 constexpr 变量都必须在编译时求值吗?

解决方法

首先,godbolt 链接(gcc 11.1)中使用的编译器允许可变长度数组。所以 a not 必须是一个常量表达式。即下面的这段代码将被接受

int a = 5;
int arr[a];

但是当您确实需要将某些东西作为常量表达式时,constexpr 将允许您使用其中的变量/函数。

constexpr - 指定变量或函数的值可以出现在>常量表达式

例如,当您使用 std::array 模板创建数组时,大小必须是恒定的

这样做是不行的

int a = 5;
std::array<int,a> arr;

另一方面,constexpr 允许在常量表达式中使用 a,因此您可以这样做

constexpr int a = 5;
std::array<int,a> arr;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。