2016-02-12 33 views
4

這裏是我讀的:using alias for static member functions?任何爲無效的函數聲明constexpr的原因?

在答案我看到一個建議,使用constexprvoid函數使用constexpr的原因是什麼?

請演示一個簡單的用例。我是constexpr的新手,所以在複雜的例子中,我不會理解這個要點。

+1

供參考:在這個問題沒有什麼建議做功能'constexpr'。它使得該成員的*成員指針*成爲'constexpr'。這意味着變量引用在編譯時可用的函數。 –

回答

0

只要參數號是一個整數常量,這個constexpr版本將在編譯時計算結果(僅限C++ 11編譯器)。當這個數字是一個運行時間整數時,這個相同的函數完全有能力在運行時計算結果。所以你不需要同一個程序的兩個不同版本:一個用於編譯時,另一個用於運行時。一個實現完成了這一切。

+1

返回void的函數通常不會計算結果(除非您拒絕拋出異常) – MikeMB

2

具體根據C++ 14標準,空隙是文字型

A型爲文本類型,如果它是:

- 無效;或

- 標量類型;或

- 參考類型;或

- 文字類型數組;或

- 類類型(第9),其具有以下所有性能: - 它有一個簡單的析構函數,

- 它是一個聚合類型(8.5.1)或具有至少一個constexpr 構造函數或構造函數模板不是複製或移動 構造函數,

- 所有非靜態數據成員和基類是 非易失性文字類型。

here

的任意表達式語句是允許的,以便允許 調用執行檢查功能,並允許斷言狀 構建體。 void也變成了文字類型,所以只存在執行這種檢查的函數可能會返回void。

+3

請給出一個簡單的用例。 – Narek

4

Rahul的答案引用了允許voidconstexpr函數的標準段落,但它沒有給出用例。我想到的一個用例是擁有一個constexpr類,並且像通常一樣排除輔助方法中方法的共同行爲。該標準明確提及進行檢查的功能,例如斷言。我手邊沒有一個具體的例子,但我可以想象像

class A 
{ 
public: 
    constexpr X doSomething(Y arg1) { 
     checkInvariant(); 
     constraintOnYArgument(arg1); 
     // ... 
     checkInvariant();   
    } 

    constexpr X doSomethingElse(Y arg1) { 
     checkInvariant(); 
     constraintOnYArgument(arg1); 
     // ... 
     checkInvariant();   
    } 

private: 
    constexpr void constraintOnYArguments(Y arg) { 
    } 

    constexpr void checkInvariant() { 
     // some checks 
     if (!some condition) { 
      throw std::logic_error("Oh no!"); 
     } 
    } 
}; 
+1

我認爲,這是更有用的答案。特別是,在C++ 11中,你可以在constexpr函數中使用'throw'。 – MikeMB

相關問題