程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了我们如何理解 constexpr 的“如果可能”大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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

开发过程中遇到我们如何理解 constexpr 的“如果可能”的问题如何解决?下面主要结合日常开发的经验,给出你关于我们如何理解 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;

大佬总结

以上是大佬教程为你收集整理的我们如何理解 constexpr 的“如果可能”全部内容,希望文章能够帮你解决我们如何理解 constexpr 的“如果可能”所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。