Совокупная инициализация

Если у меня есть структура, и я инициализирую ее так:

#include <memory>

struct MyHandle
{
std::shared_ptr<int> handle_;
};

int main()
{
MyHandle m{std::make_shared<int>(42)};
}

Является ли тот факт, что агрегатная инициализация MyHandle происходит так нет конструктора используется для инициализации объекта типа MyHandle?

2

Решение

Правильно. Агрегированная инициализация разрешена только для классов без предоставленных пользователем конструкторов, и (по словам стандарта C ++ 11 8.5.1 / 2) «каждый член инициализируется копией из соответствующего предложения инициализатора». Так что нет конструктора для MyHandle используется только конструктор копирования, перемещения или преобразования для каждого члена класса.

Неявный конструктор по умолчанию, который инициализирует каждый элемент по умолчанию, используется для инициализации по умолчанию и значения; но его нельзя использовать для агрегированной инициализации, поскольку каждый элемент может быть инициализирован только один раз.

3

Другие решения

MyHandle не POD, потому что POD не может содержать не-POD членов (и shared_ptr не POD). Конструктор shared_ptr определенно вызывается при создании объекта MyHandle.

4

Очевидно, std :: shared_ptr не является POD, вы можете использовать станд :: is_pod проверить тип POD:

std::is_pod<std::shared_ptr<int>>::value

должен вернуть 0

2
По вопросам рекламы [email protected]