Мне кажется, что агрегатная инициализация (подходящих типов) не считается конструктором, который вы можете вызвать (за исключением нескольких случаев).
Например, если у нас очень простой тип агрегата:
struct Foo {
int x, y;
};
тогда это очевидно работает:
auto p = new Foo {42, 17}; // not "Foo (42, 17)" though...
но это не работает ни на одном из протестированных мной компиляторов (включая последние версии MSVC, GCC и Clang):
std::vector<Foo> v;
v.emplace_back(2, 3);
Опять же, мне кажется, что любой код, который хочет вызвать конструктор для типа T
(в данном случае код в vector::emplace_back
который пересылает переданные аргументы в c'or of T
,) не может просто использовать агрегатную инициализацию (кажется), потому что они используют скобки вместо фигурных скобок!
Это почему? Это просто пропущенная функция (никто еще не предложил/не реализовал ее) или есть более глубокие причины? Это немного странно, потому что агрегатные типы по определению не имеют другого конструктора, который делает разрешение неоднозначным, поэтому язык мог бы просто определить конструктор агрегатов по умолчанию (или что-то в этом роде), в котором все члены были бы аргументами по умолчанию.
Это просто вопрос синтаксиса? Если бы реализация vector::emplace_back
в приведенном выше примере использовала размещение new
с фигурными скобками вместо скобок, сработало бы это?
Примечание: я хочу поблагодарить те комментарии, которые указали на поведение vector
и emplace
потому что их комментарии будут полезны тем, кто найдет этот вопрос по этим ключевым словам, но я также хочу отметить, что это всего лишь примеры. Я выбрал самый знакомый и лаконичный пример, но моя точка зрения касалась явного вызова агрегатного инициализатора в любом коде (или, в частности, при placement new
).