簡體   English   中英

在帶有static_assert的命名空間中使用constexpr會產生錯誤

[英]Using constexpr in a namespace with static_assert is giving error

我已經在頭文件中聲明了以下內容。

namespace G1
{
    inline namespace V1
    {
        constexpr float getV();
    }
}

在CPP文件中,我將getV函數定義為

constexpr float G1::V1::getV()
{
    return 0.1f;
}

我主要使用static_assert比較顯示的版本。

int main()
{
    static_assert( G1::getV() == 1.0f, "Error"); // Please Ignore the way I am comparing the floats
    return 0;
}

但是,當我編譯代碼時,我得到的expression did not evaluate to a constant求得expression did not evaluate to a constant

我在這里做錯什么嗎? 我正在使用VS2015。 提前致謝

實際上,C ++編譯模型分為兩個階段。 首先編譯,然后鏈接。

constexpr僅在編譯階段有效。 不需要編譯器可以將constexpr函數體折疊到調用站點中,這需要鏈接時constexpr評估。

因此,當您無法為constexpr函數提供主體時,任何看不到該主體的人都不會在編譯時對其進行求值 ,而是等到運行時再進行評估

constexpr並不意味着“將在編譯時運行”,而是“在某些情況下可以在編譯時運行”。

如果要讓編譯器編譯main了解getV 在編譯時返回的值,則也必須在標頭中實現該函數。 由於使用static_assert ,因此在編譯時需要定義。

這樣,只有包含getV的.cpp文件的編譯器才能知道它返回的內容。 通常這是一個不同的編譯器調用。

按鏈接時間,檢查static_assert為時已晚。

錯誤消息: expression did not evaluate to a constant是由編譯器不知道實現引起的。 在“運行時”上下文中,它將在此處插入一個調用,稍后由鏈接程序修復並在運行時執行。 但是,運行時調用絕不是編譯時間常數。

暫無
暫無

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

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