При изменении существующего кода я случайно обнаружил, что объявление псевдонима создает std::optional. Это произошло из следующего кода шаблона:
Код: Выделить всё
using ret_t = std::invoke_result_t;
using opt_ret_t = std::optional;
позже код различает случай, когда тип возвращаемого значения (не) void, поэтому фактический необязательный объект никогда не создается. Чтобы убедиться, что я ничего не упустил, я добавил утверждение в эту ветку кода, и все скомпилировалось:
В cppreference указано: Не существует необязательных ссылок, функций, массивов или cv void; программа является неправильной, если она создает необязательный параметр такого типа. Итак, несмотря на то, что компиляторы не жалуются, этот код неправильно сформирован?
Подробнее здесь:
https://stackoverflow.com/questions/787 ... name-valid