C++ стандартизирует поведение std:: необязательный при std::min и std::max?
У меня не установлен совсем новый компилятор, чтобы получить подсказку о том, что в итоге std::optional
семантика будет. Но в C++14 следующее:
#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; если что-то актуальное планируется стандартизировать, я постараюсь соответствовать этому.
1 ответ
Что-то вроде того, что я ожидал, стандартизировано в C++17
Нет.
или предложено для стандартизации позже?
Нет такого предложения ни в одной из рассылок.
Хотя, конечно, есть много простых обходных путей, поэтому есть мало причин для такого предложения:
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))
Там, наверное, другие. Первые два не могут дать вам висячую ссылку, последние четыре могут.