繁体   English   中英

编译错误:使用constexpr声明std :: array的大小

[英]Compile Error: Use constexpr to declare std::array size

我正在学习constexpr ,据我所知, constexpr告诉编译器在编译时而不是运行时计算函数。 我使用以下代码进行测试,但遇到了我真的不明白的错误。 你能解释为什么吗?

#include <iostream>
#include <array>
using namespace std;

constexpr int foo(int i)
{
    return i + 5;
}

int main()
{
    int i = 10;
    std::array<int, foo(5)> arr; // OK
    // But...
    std::array<int, foo(i)> arr1; // Error
}

错误是:' i '的值不能在常量表达式中使用。 为什么? i预先声明了为什么它必须是const

就我的理解而言,constexpr告诉编译器在编译时而不是运行时计算函数。

不完全是:使用constexpr ,编译器可以(不是必须)计算函数的编译时间。 然后,编译器会在必要且可能的情况下执行此操作。

的情况下

std::array<int, foo(5)> arr; // OK

这是必要的(因为必须在编译时知道std::array的第二个模板参数)并且可能的(因为在编译时知道5)。

但是随着

int i = 10;
std::array<int, foo(i)> arr1; // Error

这是必需的( std::array ),但不可能(因为i是一个非恒定变量,并且编译器不能使用i值编译时间,而只能使用运行时)。

这是必要的,但不可能,因此是错误。

但是你可以写

int i { 10 };
int j { foo(i) };

因为不可能调用foo(i)编译时,但这不是必需的(因为j可以初始化运行时)。 因此foo(i)被称为(据说)运行时。

要使用foo(i)编译std::array ,应将i定义为constexpr (或const

constexpr int i { 10 };

因此编译器可以使用i编译时间的值。

为什么? 我事先被声明了为什么它必须是一个const?

简短的答案:因为C ++ 11标准这么说。

长答案:因为以这种方式,构造编译器更简单。 如果要使用值编译时间,则可以将其声明为constexpr ,然后编译器将检查它是否从未修改。 (相对)容易做到。

否则,如果您可以使用编译时非恒定变量的值,则编译器应遵循变量的故事,以确定在constexpr函数中使用变量时的值。 在您的玩具示例中很简单,在现实生活中将是一场噩梦。

暂无
暂无

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

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