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))

Там, наверное, другие. Первые два не могут дать вам висячую ссылку, последние четыре могут.

Другие вопросы по тегам