2017-08-02 99 views
-6

我沒有安裝最新的編譯器,以獲得最終的std::optional語義將要發生的提示。但在C++ 14中,有以下幾種:C++是否在std :: min和std :: max下標準化std :: optional的行爲?

#include <experimental/optional> 
#include <algorithm> 

int main() 
{ 
    using oint = std::experimental::optional<int>; 
    int x = std::max(1, 2); 
    auto oy = oint{3}; 
    auto z = std::max(x, oy); 
} 

不能編譯。現在,在未來,我希望/希望在這種情況下z會得到3;如果oy = oint{}z可能得到2

就像我期望在C++ 17中標準化或稍後提出標準化?或者,是未定義標準化(就像它在C++ 14中的排序)?

注意:這裏的動機可能是我自己實現的事情,對於C++ 17之前的代碼;如果有相關的計劃是標準化的,我會嘗試匹配。

+10

我不明白這是如何混淆。 ['std :: max'](http://en.cppreference.com/w/cpp/algorithm/max)期望它的兩個參數具有相同的類型。 – Justin

+5

['std :: optional'](http://en.cppreference.com/w/cpp/utility/optional/operator_cmp)有比較運算符;你可以使用'std :: max(oint {x},oy)' – Justin

+0

...或者作爲一個更糟的選擇,用'std :: max(x,oy.value_or(std :: numeric_limits :: min()));'。 – dfri

回答

3

是像我所期待的標準化,C++ 17

,或者後來又提出了標準化?

mailings中沒有任何這樣的建議。

當然,雖然有很多簡單的解決方法,因此,沒有理由對這樣的建議:

oy ? std::max(x,*oy) : x; 
x < oy ? *oy : x 
*std::max(oint(x), oy) 
*std::max<oint>(x, oy) 
*std::max(oy, {x}) 
std::max(x, oy.value_or(x)) 

有可能是別人。前兩個不能給你一個懸而未決的參考,最後四個可以。

相關問題