Прямая и равномерная инициализация в std::allocator

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

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

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

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

1 ответ

Решение

Я не знаю, что рассматривал 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 {} хорошо даже в общих контекстах.

Другие вопросы по тегам