2017-08-02 83 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)) 

有可能是别人。前两个不能给你一个悬而未决的参考,最后四个可以。

相关问题