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