繁体   English   中英

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)];

将使用非标准VLA(可变长度阵列)扩展。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM