Прямая и равномерная инициализация в std :: allocator - PullRequest
7 голосов
/ 19 октября 2011

Этот вопрос также был отправлен в Usenet, где он более уместен, но это более крупный и надежный форум.

std::allocator::construct определено для пересылки параметра параметра Упаковка в конструкцию объекта с использованием круглых скобок, a.k.a. прямая инициализация.

Если бы он использовал фигурные скобки, то есть.к.а. равномерная инициализация, мы могли бы инициализировать агрегировать типы данных из таких функций, как std::make_shared и container::emplace. Кроме того, было бы приемлемо положить содержимое списка инициализаторов в список аргументов такой функции, решение проблемы вычета типа initializer_list при пересылка.

Была ли эта альтернатива рассмотрена и отклонена? Слишком поздно переключаться в будущем стандарте? Кажется, это будет серьезное изменение, но не особо отвратительный.

1 Ответ

9 голосов
/ 19 октября 2011

Я не знаю, что рассматривал SC, но имейте в виду, что единообразная инициализация на самом деле не «работает» в общих контекстах (построение значений запрета *).Рассмотрим эту попытку:

template<typename T, typename... Args>
T
make(Args&&... args)
{
    return T { std::forward<Args>(args)... };
}

Вы получаете:

assert( make<std::vector<int>>(10, 0).size() == 2 );
assert( std::vector<int>(10, 0).size() == 10 );

, и это не компилируется:

make<std::vector<int*>>(10u, 0);

, тогда как это:

std::vector<int*>(10u, 0);

Если конкретное взаимодействие между совершенной пересылкой и списками инициализаторов, которое вызывает это, было формализовано достаточно скоро, я мог видеть, что SC не хочет перезапускаться с нуля.

(*): T {} хорошо даже вобщие контексты.

...