2017-04-18 63 views

回答

14

是的。從[temp.constr.expr],措詞的N4641

一種表達約束是指定通過的模板參數替代上的表達E的形成的要求的約束。如果替代產出E沒有失敗,則滿足表達式約束。 在表達式約束中,E是未評估的操作數(第5章)。

所以使用declval應該沒問題。

或者,你可以僅僅創建以來的要求的範圍內所需要的類型的對象,我們並沒有實際構建什麼:

template<typename T> 
concept bool SomeConcept = requires(T a, int i) { 
    { a.someFunction(std::move(i)) } -> int; 
}; 
+0

感謝巴里!順便說一句,接收變量還有其他什麼好處,而不是更可讀的語法嗎?這只是更好的練習還是我應該注意的一些陷阱? –

+0

@GuillaumeRacicot可能早點談論什麼是更好的做法。就個人而言,我希望在可能的情況下避免所有的前期元編程黑客行爲。 – Barry