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