如果有一个方法将指针作为参数,另一个方法将引用作为参数,我该如何专门调用其中一个?
例如。
int foo (int const& lippman) { \do something }
int foo (int && lippman) { \do something else }
- 所以现在当我想调用其中一个时,我该如何调用它/编译器如何区分这两个(显然是通过参数,但是如何?)
由于
答案 0 :(得分:3)
int foo (X const&);
int foo (X&&);
这些不是指针。第一个是const引用,第二个是r值引用。要区分它们:
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"
使用与上述相同的x实例进行呼叫:
foo(&x); // get address of x and pass to "foo"
答案 1 :(得分:2)
两个函数都有引用作为参数,第一个是左值引用,第二个是右值引用。
第一个重载将使用左值调用,第二个使用右值:
int i = 42;
foo(i); // first one gets called
foo(42); // second one gets called
此行为在C ++标准中列出,编译器需要能够确定什么是左值以及什么是右值,以选择正确的重载。
请注意,您可以使用std::move
使左值看起来像右值:
foo(std::move(i)); // second overload gets called