Они описаны как эквивалентные в cppreference, как перегрузки (1) и (2)
Однако и Clang, и GCC, похоже, обрабатывают эти игрушечные примеры функций по-другому.
Код: Выделить всё
#include
struct Data { char large_data[0x10000]; };
std::optional nullopt_init()
{
return std::nullopt;
}
std::optional default_init()
{
return {};
}
Код: Выделить всё
has_valueКод: Выделить всё
nullopt_init():
mov BYTE PTR [rdi+65536], 0
mov rax, rdi
ret
Код: Выделить всё
default_init():
sub rsp, 8
mov edx, 65537
xor esi, esi
call memset
add rsp, 8
ret
Обновление: GCC (начиная с версии 11.1) и Clang (начиная с версии 12.0.1) теперь эффективно обрабатывают обе формы.
Подробнее здесь: https://stackoverflow.com/questions/579 ... stdnullopt
Мобильная версия