Почему std::optional не вызывает Value-initialization хранящегося значения? С++

Есть такой код:

#include <iostream>
#include <optional>

struct Def {
    int i;
    Def() : i(10) {std::cout << "DEF DEFAULt" << std::endl;}
};

int main() {

    std::optional<Def> opt {};
    std::cout << opt->i << std::endl;

    return 0;
}

Я использую Value-initialization при объявлении переменной типа optional, значит для всех его переменных-членов должна также применяться value-initialization. Это также значит, что должен вызваться конструктор моей структуры и инициализировать i значением 10 и вывести сообщение. Почему этого не происходит? Optional же как-то хранит объект моей структуры, тогда почему для нее не вызывается user-defined конструктор по умолчанию при value-initialization?


Ответы (1 шт):

Автор решения: KoVadim

Потому что по умолчанию, оно создается пустым (то есть, объект не создается).

https://en.cppreference.com/w/cpp/utility/optional/optional

  1. Constructs an object that does not contain a value.

Проверка очень простая

std::cout << opt.has_value()  << "\n";

А вот то, что удалось обратится к переменной - обычное UB, ничего необычного. int, как и много других примитивных типов очень терпимы к подобному.

https://en.cppreference.com/w/cpp/utility/optional/operator*

The behavior is undefined if *this does not contain a value.

→ Ссылка