Почему 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 шт):
Потому что по умолчанию, оно создается пустым (то есть, объект не создается).
https://en.cppreference.com/w/cpp/utility/optional/optional
- 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.