Они описаны как эквивалент в cppreference, как форма (1)
Однако и 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