2014-09-24 2 views
0

Если есть один метод, который принимает указатель как параметр и другой перегруженный метод, который принимает ссылку в качестве параметра, как я могу назвать тот или иной конкретный?Вызывающий указатель и ссылочный метод

Например.

int foo (int const& lippman) { \do something } 
int foo (int && lippman) { \do something else } 

- Так что теперь, когда я хочу, чтобы вызвать одну или другую сторону, как я называю это/как компилятор различать два (очевидно, от параметра, но как?)

Благодарности

+4

Ни один из этих берет указатель. – juanchopanza

ответ

2

Обе функции имеют ссылки в качестве параметров, первая - опорная величина, вторая - ссылочная позиция rvalue.

Первая перегрузка будет вызвана с lvalues, второй с rvalues:

int i = 42; 
foo(i); // first one gets called 
foo(42); // second one gets called 

Такое поведение приводится в стандарте C++ и компиляторы должны быть в состоянии выяснить, что является Левое и что такое rvalue, чтобы выбрать правильную перегрузку.

Обратите внимание, что вы можете использовать, чтобы сделать std::move именующие выглядеть как RValue:

foo(std::move(i)); // second overload gets called 

См working example.

+0

Так что же такое с правом голоса? Если что-то не так с ответом, я буду рад исправить это. – juanchopanza

+0

Как получается, что std :: move (i) принимается за rvalue ?? – Jarvis

+0

@ user3258312 Это умная комбинация приведения к rvalue reference '&&' и скрыть имя. См. [This related SO post] (http://stackoverflow.com/questions/7510182/how-does-stdmove-transfer-values-into-rvalues). – juanchopanza

3
int foo (X const&); 
int foo (X&&); 

Это не указатель. Первый состоит в константной ссылке, второй по ссылке г-значение. Для того, чтобы различать между ними:

X x{}; 
foo(x); // call the first version 
foo(std::move(x)); // call the second version (also with temporary: foo(X{});) 

Примечание: Третья перегрузка (указателем) будет:

int foo(X* x); // or "const X* x" or "const X* const x" 

Для вызова с тем же х, например, как описано выше:

foo(&x); // get address of x and pass to "foo" 
Смежные вопросы