這裏是我讀的:using alias for static member functions?任何爲無效的函數聲明constexpr的原因?
在答案我看到一個建議,使用constexpr
。 void
函數使用constexpr
的原因是什麼?
請演示一個簡單的用例。我是constexpr
的新手,所以在複雜的例子中,我不會理解這個要點。
這裏是我讀的:using alias for static member functions?任何爲無效的函數聲明constexpr的原因?
在答案我看到一個建議,使用constexpr
。 void
函數使用constexpr
的原因是什麼?
請演示一個簡單的用例。我是constexpr
的新手,所以在複雜的例子中,我不會理解這個要點。
只要參數號是一個整數常量,這個constexpr版本將在編譯時計算結果(僅限C++ 11編譯器)。當這個數字是一個運行時間整數時,這個相同的函數完全有能力在運行時計算結果。所以你不需要同一個程序的兩個不同版本:一個用於編譯時,另一個用於運行時。一個實現完成了這一切。
返回void的函數通常不會計算結果(除非您拒絕拋出異常) – MikeMB
Rahul的答案引用了允許void
constexpr
函數的標準段落,但它沒有給出用例。我想到的一個用例是擁有一個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!");
}
}
};
我認爲,這是更有用的答案。特別是,在C++ 11中,你可以在constexpr函數中使用'throw'。 – MikeMB
供參考:在這個問題沒有什麼建議做功能'constexpr'。它使得該成員的*成員指針*成爲'constexpr'。這意味着變量引用在編譯時可用的函數。 –