Мне кажется, что агрегатная инициализация (подходящих типов) не считается конструктором, который вы можете вызвать (кроме нескольких случаев).
Например, если у нас очень простой агрегатный тип:
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
, который передает переданные аргументы в cT
,) не может использовать агрегатную инициализацию просто (кажется), потому что они используют скобки вместо фигурных скобок!
Почему это так?Это просто пропущенная функция (никто еще не предложил / не реализовал ее) или есть более глубокие причины?Это немного странно, потому что агрегатные типы по определению не имеют другого конструктора, который делает разрешение неоднозначным, поэтому язык мог бы просто определить конструктор агрегатов по умолчанию (или что-то в этом роде), в котором все члены были бы аргументами по умолчанию.
Это просто вопрос синтаксиса?Если бы реализация vector::emplace_back
в вышеприведенном примере использовала размещение new
с фигурными скобками вместо скобок, сработало бы это?
Примечание : Я хочу поблагодарить те комментарии, которыеЯ указал на поведение vector
и emplace
, потому что их комментарии будут полезны тем, кто найдет этот вопрос по этим ключевым словам, но я также хочу отметить, что это всего лишь примеры.Я выбрал самый знакомый и лаконичный пример, но моя точка зрения касалась явного вызова агрегатного инициализатора в любом коде (или в placement new
, точнее.)