constexpr 函数作为数组大小
constexpr function as array size
我想弄清楚为什么我的代码在不应该编译的时候可以编译:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
constexpr int ret_one()
{
return 1;
}
constexpr int f(int p)
{
return ret_one() * p;
}
int main() {
int i = 2;
srand(time(0));
int j = rand();
int first_array[f(10)]; // OK - 10 is a constant expression
int second_array[f(j)]; // Error - the parameter is not a constant expression
j = f(i); // OK - doesn't need to be constexpr
std::cout << sizeof(second_array);
return 0;
}
所以 first_array
定义没问题。
但是因为 j
不是常量表达式,所以 second_array
的定义应该是错误的。在每个程序 运行 上,我得到不同的数组大小。它应该如何工作?在我的书中,作者明确指出 constepxr 是一个表达式,其值可以在编译时求值。 rand()
可以在编译时求值吗?我觉得不可能。
一些编译器,例如 GCC,允许将 C 风格的可变长度数组作为 C++ 的扩展。如果您的编译器这样做,那么您的代码将编译。
如果您使用的是 GCC,则可以使用 -Wvla
或 -pedantic
.
启用警告
事实上,
int second_array[f(j)];
将使用非标准 VS(可变长度数组)扩展。
我想弄清楚为什么我的代码在不应该编译的时候可以编译:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
constexpr int ret_one()
{
return 1;
}
constexpr int f(int p)
{
return ret_one() * p;
}
int main() {
int i = 2;
srand(time(0));
int j = rand();
int first_array[f(10)]; // OK - 10 is a constant expression
int second_array[f(j)]; // Error - the parameter is not a constant expression
j = f(i); // OK - doesn't need to be constexpr
std::cout << sizeof(second_array);
return 0;
}
所以 first_array
定义没问题。
但是因为 j
不是常量表达式,所以 second_array
的定义应该是错误的。在每个程序 运行 上,我得到不同的数组大小。它应该如何工作?在我的书中,作者明确指出 constepxr 是一个表达式,其值可以在编译时求值。 rand()
可以在编译时求值吗?我觉得不可能。
一些编译器,例如 GCC,允许将 C 风格的可变长度数组作为 C++ 的扩展。如果您的编译器这样做,那么您的代码将编译。
如果您使用的是 GCC,则可以使用 -Wvla
或 -pedantic
.
事实上,
int second_array[f(j)];
将使用非标准 VS(可变长度数组)扩展。