2014-06-10 70 views
8

我想知道是否有必要聲明constexpr函數和方法的限制,就像內聯函數和方法一樣。聲明constexpr函數或方法

我知道內聯函數或方法必須寫在頭文件中,以使編譯器能夠訪問它們被調用的定義。它將使意義,如果有對constexpr類似的東西,但我不能設法找到該點什麼...

所以基本上我的問題是:

  • 我能寫的定義constexpr函數在頭文件中沒有冒着重複符號的風險?

  • 我可以分開constexpr函數或方法的聲明和定義嗎?

+0

這可能與http:// stackoverflow有關。com/questions/4748083/when-should-you-use-constexpr-capability-in-c11 – alediaferia

+7

[dcl.constexpr]/2「'constexpr'函數和'constexpr'構造函數隱式'inline'」這就意味着你*需要*使用函數的每個翻譯單元(源文件)中的定義,並且您可以在不同源文件中具有多個定義(只要它們相同)(請參閱ODR)。 – dyp

+0

相關:http://stackoverflow.com/questions/14391272/does-constexpr-imply-inline – dyp

回答

3

您定義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。

注意,對於一般的常量表達式和調用規則是不同的:在一般通話需要的定義是某處在翻譯單元:常量表達式要求的定義是常量表達式之前。