簡體   English   中英

constexpr數組引用參數

[英]constexpr array reference parameter

有人可以解釋為什么下面標記的行編譯得很好:

template<typename T, int N>
constexpr
int get_size(T (&)[N])
{
    return N;
}

int main()
{
    int xs[10];
    constexpr int y = get_size(xs); // HERE.
    static_assert(10 == y, "wrong size");
}

直覺上, get_size(xs)不是一個常量表達式,因為xs本身不是這樣,我不明白它為什么會起作用。

模板函數實例化后,您的程序將等同於以下內容:

constexpr
int get_size(int (&)[10])
{
    return 10;
}

int main()
{
    int xs[10];
    constexpr int y = get_size(xs); // HERE.
    static_assert(10 == y, "wrong size");
}

然后在函數調用替換后,它變為等效於以下內容:

int main()
{
    int xs[10];
    constexpr int y = 10; // HERE.
    static_assert(10 == y, "wrong size");
}

函數調用替換在7.1.5 [dcl.constexpr] / 5中描述。 基本上,參數替換為復制初始化,然后替換為返回表達式中的出現。 然后返回表達式同樣如果復制初始化返回值。 然后,結果表達式成為函數調用的表達式。 只有之后才考慮表達式,如果它滿足上下文放置的常量表達式的約束。 (注意,質量編譯器當然可以確定constexpr函數在任何此類操作之后永遠不能成功使用,並且在對函數定義進行加權后可能會失敗,但它不必)

另請注意,只是為了讓您感到困惑,這個概念在C ++ 14中被刪除,並替換為constexpr函數的評估方法。 除了其他功能之外,您還可以使用if語句,constexpr函數中的文字類型的語句和局部變量。

你的問題和評論:

我想我很困惑為什么一個地址未知的自動變量可以通過引用常量表達式中使用的函數來傳遞

當編譯器看到get_size(xs) ,它已經解析了前一行,即int xs[10]; 因此知道xs的類型和大小。 在運行時沒有什么會改變,只要涉及類型大小 - 這兩個是編譯所需的信息以實例化函數模板,因此它不會面臨實例化函數模板的任何問題,在這種情況下,它表現為constexpr因為在編譯時一切都是已知的,這就是static_assert不會失敗的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM