Если у меня есть структура, и я инициализирую ее так:
#include <memory>
struct MyHandle
{
std::shared_ptr<int> handle_;
};
int main()
{
MyHandle m{std::make_shared<int>(42)};
}
Является ли тот факт, что агрегатная инициализация MyHandle происходит так нет конструктора используется для инициализации объекта типа MyHandle?
Правильно. Агрегированная инициализация разрешена только для классов без предоставленных пользователем конструкторов, и (по словам стандарта C ++ 11 8.5.1 / 2) «каждый член инициализируется копией из соответствующего предложения инициализатора». Так что нет конструктора для MyHandle
используется только конструктор копирования, перемещения или преобразования для каждого члена класса.
Неявный конструктор по умолчанию, который инициализирует каждый элемент по умолчанию, используется для инициализации по умолчанию и значения; но его нельзя использовать для агрегированной инициализации, поскольку каждый элемент может быть инициализирован только один раз.
MyHandle не POD, потому что POD не может содержать не-POD членов (и shared_ptr не POD). Конструктор shared_ptr определенно вызывается при создании объекта MyHandle.
Очевидно, std :: shared_ptr не является POD, вы можете использовать станд :: is_pod проверить тип POD:
std::is_pod<std::shared_ptr<int>>::value
должен вернуть 0