2017-08-02 1 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); 
} 

はコンパイルされません。今、将来的には、z3になることを期待しています。 oy = oint{}の場合、z2になります。

私はC++で標準化されていると思っていますか?17、または後で標準化のために提案しましたか?あるいは、undefinabilityが標準化されています(C++ 14のようなものです)?

注:ここでの動機は、おそらく自分自身を、C++プリコードのために実装している可能性があります。関連するものが標準化される予定の場合、私はそれにマッチしようとします。

+10

これはどのように混乱しているのか分かりません。 ['std :: max'](http://en.cppreference.com/w/cpp/algorithm/max)は、2つのパラメータが同じ型を持つと想定しています。 – 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)) 

他の人はおそらくありますが。最初の2つはあなたに迷惑な参照を与えることはできません、最後の4つはできます。

関連する問題