问题描述
我已阅读有关 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;