Может ли c ++ «передать по ссылке, если это возможно»? - PullRequest
1 голос
/ 29 апреля 2019

У меня есть метод с параметром, доступным только для чтения.

template <typename T>
void foo(const T t) {...}

Преимущество этого определения в том, что foo(2) синтаксически корректен.Однако у него есть и обратная сторона: применение foo к большому объекту заставляет его копировать объект.Поскольку я только читаю из аргумента, это просто трата времени и памяти.

Стандартное решение - сделать параметр t константной ссылкой.Однако у этого есть и недостаток: foo(2) больше не является синтаксически правильным.Я должен был бы сделать int i = 2; foo(i);, что я считаю неудачным.

Есть ли способ получить лучшее из обоих миров?Так что foo(2) является синтаксически правильным и применение foo к объекту заставляет его проходить по ссылке?

РЕДАКТИРОВАТЬ: Очевидно, что константная ссылка уже является лучшей из обоих миров.Теперь я хотел бы знать, почему это так.Почему foo(2) синтаксически правильный?Как 2 может стать здесь ссылкой?

1 Ответ

1 голос
/ 29 апреля 2019

C ++ материализует временные файлы, когда это необходимо, и вы можете привязать временное значение к const&, но не к &.

Таким образом, foo_value(2) создает int со значением 2, называемым t в качестве параметра. foo_cref(2) создает анонимный временный объект, затем привязывает к нему параметр int const& t, где foo_value и foo_cref - это очевидные варианты foo, о которых вы говорите в вопросе.

...