簡體   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