【问题标题】:Calling pointer and reference method调用指针和引用方法
【发布时间】:2014-11-19 02:19:27
【问题描述】:

如果有一个方法将指针作为参数,而另一个重载方法将引用作为参数,我该如何具体调用其中一个?

例如。

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

-- 所以现在当我想调用一个或另一个时,我该如何调用它/编译器如何区分两者(显然是通过参数,但如何?)

谢谢

【问题讨论】:

  • 这些都不需要指针。

标签: c++ pointers


【解决方案1】:
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"

【讨论】:

    【解决方案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
    

    查看working example

    【讨论】:

    • 那么反对票是怎么回事?如果答案有问题,我很乐意解决。
    • std::move(i) 怎么被当作右值??
    • @user3258312 它巧妙地将转换为右值引用&& 并隐藏名称。见this related SO post
    • 谢谢。现在说得通了。
    猜你喜欢
    • 2012-05-09
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多