2011-08-21 68 views
3

我注意到,即最後一個C++的在[24.4.7] - 標準文件N3291 max IST不constexprC + + 11:在static_assert()中的std :: max(a,b)?

template<class T> const T& max(const T& a, const T& b); 

因此,不允許在一個static_assert例如使用它。正確?

static_assert(max(sizeof(int),sizeof(float)) > 4, "bummer"); 
+1

'static_assert(的sizeof(int)的> 4 ||的sizeof(浮動)> 4, 「無賴」);' –

回答

4

這是正確的。

我想象中的原因很簡單,std::max電話T::operator<對於任意類型Tstd::maxconstexpr,它需要T::operator<constexpr,這還是個未知數。

+0

的確 - 謝謝。 – towi

+1

補救。你可以創建自己的僅用於模板的'struct Max '來創建一個靜態的'max' ... –

+0

所以這意味着訪問模板類型成員_cannot_的模板函數/類永遠是'constexpr'嗎?這似乎很愚蠢。爲什麼這是標準? –

2

這是正確的; std::minstd::max不是constexpr,即使在最新的C++ 14草案(N3690)中也沒有,所以它們不能在常量表達式中使用。

沒有很好的理由,只有不好的理由。最明顯的不好的原因是C++委員會由有限的時間進行標準化工作的個人組成,沒有人負責完成這些功能constexpr

N3039,變化到在2010年通過的C++標準,特異性略微延長了constexpr設施,使得功能如minmax可以作出constexpr

您可以解決這個定義自己minmax功能:

template<typename T> 
constexpr const T &c_min(const T &a, const T &b) { 
    return b < a ? b : a; 
} 
template<typename T, class Compare> 
constexpr const T &c_min(const T &a, const T &b, Compare comp) { 
    return comp(b, a) ? b : a; 
} 
template<typename T> 
constexpr const T &c_min_impl(const T *a, const T *b) { 
    return a + 1 == b ? *a : c_min(*a, c_min_impl(a + 1, b)); 
} 
template<typename T> 
constexpr T c_min(std::initializer_list<T> t) { 
    return c_min_impl(t.begin(), t.end()); 
} 
// ... and so on 
+0

我不能完全遵循N3039思路 - 聽起來像「'const&'幾乎是'constexpr'」,我覺得這有點遠了。當我解釋'const'事物時,我不會教給我的學生。另外,我對你的暗示有點懷疑*「C++是一個糟糕的標準,因爲沒有全職的標準化工具」*(* ehem * ;-)。我對委員會的工作沒有足夠的見解,但我總是猜測有很多討論和工作正在進行。第三,@彼得 - 亞歷山大的觀點仍然存在:「運營商」在整體上必須是「constexpr」,對吧? – towi

+0

@towi請注意,在C++ 11出貨之前,N3039所做的更改顯着擴展(允許*任意*參考類型爲文字類型)。我們的執行者喝了「不斷表達評價的毒藥」,畢竟它並沒有那麼糟糕。你的推論我說*「C++是一個糟糕的標準」*是不正確的。這只是一個事實,委員會由人組成,而且我們有限的時間。 'operator''通常不需要是'constexpr',因爲'constexpr'函數不需要總是產生常量。 –

+0

我剛剛通過§7.1.5。(1) - (9)的閱讀,驚訝地發現你對'operator <'不需要'constexpr'是正確的,我找不到那個要求的痕跡。我想我總是假設它。只有「參數必須是*文字類型*」,它可能會在模板中實例化時失敗。那麼我想知道它的含義。 Hrmm ......(是的,我聽說過一些妥協; Herb Sutter正在咆哮一些,例如)(我希望你在我推斷後看到了這個閃爍的意思),我猜測執行'constexpr'更簡單,然後執行「另一個元語言「模板。) – towi

相關問題