Почему стандартная библиотека C ++ всегда передает std :: initializer_list <T>по значению, а не по ссылке? - PullRequest
0 голосов
/ 21 апреля 2020

Как программист C ++, меня научили простому правилу передачи параметров:

Передача параметра T по значению, когда sizeof(T) <= sizeof(void*) или для конструирование на месте и перемещение в .

Однако стандартная библиотека C ++, похоже, не соответствует правилу. Для пример , sizeof(std::initializer_list<T>) больше, чем sizeof(void*), но std::vector имеет конструктор:

vector(std::initializer_list<T>, const Allocator&);

Почему стандартная библиотека C ++ всегда передает std::initializer_list<T> по значению, а не по ссылке?

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Из cppreference в initializer_list :

Время жизни базового массива такое же, как у любого другого временного объекта, за исключением того, что инициализация объекта initializer_list из массива продлевает время жизни массива точно так же, как привязка ссылки к временному объекту (с теми же исключениями, например, для инициализации элемента класса non-stati c).

Так что initializer_list уже действует как ссылка на временное.

Идея initializer_list состоит в том, чтобы переместить данные из временных данных или скопировать их из постоянной памяти непосредственно в контейнер назначения. Это не контейнер как таковой.

2 голосов
/ 21 апреля 2020

Поскольку в области инициализации известно, что значение будет использоваться (ie скопировано) в качестве свойств контейнера (например, вектор, карта, ...), при передаче их по ссылке не будет никакого выигрыша в производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...