Descobri por acidente, ao modificar o código existente, que uma declaração de alias foi criada std::optional<void>
. Veio de um código de modelo como este:
using ret_t = std::invoke_result_t<Fn, Args...>;
using opt_ret_t = std::optional<ret_t>;
Posteriormente, o código discrimina o caso quando o tipo de retorno é (not) void
, portanto, nunca há realmente um optional
objeto criado.
Para ter certeza de que não estava faltando nada, adicionei uma afirmação nesse ramo do código e tudo compila:
static_assert(std::is_same_v<opt_ret_t, std::optional<void>>);
Não há referências opcionais, funções, arrays ou cv void; um programa está mal formado se instanciar um opcional com esse tipo.
Portanto, independentemente dos compiladores não reclamarem, esse código está mal formado?