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