Всегда ли аргументы шаблона, такие как 'T', интерпретируются как значение? - PullRequest
2 голосов
/ 20 января 2012

Рассмотрим следующий небольшой пример:

template<typename T> void foo(T a) { ... }
struct Bar { ... };
Bar x;
foo(x);

Мой вопрос: есть ли случаи, когда foo(x) может интерпретироваться как foo(const Bar& x) (x передается по ссылке) или всегда интерпретируется как foo(Bar x) (x передается по значению, то есть явной копии x)?

В моем конкретном приложении мой код основывается на том факте, что создается копия (x используется в другом потоке, а исходный x выходит за рамки). Но я не уверен, что смогу предположить это. Я использую GCC 4.6.1.

Ответы [ 2 ]

5 голосов
/ 20 января 2012

Если выведено , оно всегда будет передаваться по значению.Однако, если вы сделаете аргументы шаблона явными, вы можете передать его по ссылке:

foo<Bar&>(x); // will pass by reference
foo<Bar const&>(x); // will pass by reference to const
1 голос
/ 20 января 2012

Как написано, объект Bar будет передаваться по значению.Вы всегда можете определить другую функцию, если она вам нужна, по ссылке

Пример.

template<typename T> void fooByRef(const T& a) { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...