[英]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.