我想知道是否有必要聲明constexpr函數和方法的限制,就像內聯函數和方法一樣。聲明constexpr函數或方法
我知道內聯函數或方法必須寫在頭文件中,以使編譯器能夠訪問它們被調用的定義。它將使意義,如果有對constexpr類似的東西,但我不能設法找到該點什麼...
所以基本上我的問題是:
我能寫的定義constexpr函數在頭文件中沒有冒着重複符號的風險?
我可以分開constexpr函數或方法的聲明和定義嗎?
我想知道是否有必要聲明constexpr函數和方法的限制,就像內聯函數和方法一樣。聲明constexpr函數或方法
我知道內聯函數或方法必須寫在頭文件中,以使編譯器能夠訪問它們被調用的定義。它將使意義,如果有對constexpr類似的東西,但我不能設法找到該點什麼...
所以基本上我的問題是:
我能寫的定義constexpr函數在頭文件中沒有冒着重複符號的風險?
我可以分開constexpr函數或方法的聲明和定義嗎?
您定義constexpr
函數的地方會影響您如何使用它。特別是:
C++ 14 [expr.const] P2:
甲條件表達式
e
是芯常量表達式除非的e
評價,下列的抽象機的規則(1.9) ,將評估以下表達式之一:
- ...
- 未定義
constexpr
功能或未定義constexpr
構造函數的調用;
所以你不能使用一個常量表達式一個constexpr
功能(模板參數,constexpr
變量初始化,全局變量初始化需要靜態評估,數組邊界的表情,也許其他人),如果它只有已宣佈但尚未定義。
同樣,作爲DYP評論的,
C++ 14 [dcl.constexpr] P2
...
constexpr
功能和構造constexpr
隱含inline
(7.1.2)。
這意味着在回答你的第一個問題:在一個頭定義constexpr
功能不會造成重複的符號。這也意味着,如果您在頭文件中聲明constexpr函數,然後在翻譯單元中調用它,即使在運行時也是如此,「應該在每個使用它的翻譯單元中定義內聯函數。」來自C++ 14 [basic.def.odr] p4。
注意,對於一般的常量表達式和調用規則是不同的:在一般通話需要的定義是某處在翻譯單元:常量表達式要求的定義是常量表達式之前。
這可能與http:// stackoverflow有關。com/questions/4748083/when-should-you-use-constexpr-capability-in-c11 – alediaferia
[dcl.constexpr]/2「'constexpr'函數和'constexpr'構造函數隱式'inline'」這就意味着你*需要*使用函數的每個翻譯單元(源文件)中的定義,並且您可以在不同源文件中具有多個定義(只要它們相同)(請參閱ODR)。 – dyp
相關:http://stackoverflow.com/questions/14391272/does-constexpr-imply-inline – dyp