通过C ++中的引用选项传递

时间:2015-10-29 18:35:31

标签: c++ pointers reference rvalue-reference rvalue

我想通过引用(广义上,即A&或A *)将A类对象(称之为a)传递给另一个B类的构造函数。我不想要'a'在B内修改('a'是只读的,它的大小很大,这就是我想通过引用传递它的原因)。我知道两个选择:

1)将'a'作为

传递
{youtube}(.*){youtube}

2)将'a'作为

传递
const A & a_

选项1的缺点是我可能错误地传递r值。选项2的缺点是我可能错误地传递空指针。

我的问题是: 1)我对上述缺点是对的吗? 2)是否有另一种推荐的方式通过引用传递'a'?

我在下面的链接中看到了答案。但我很好奇是否还有其他选项而不是该问题中的内容。 Are there benefits of passing by pointer over passing by reference in C++?

3 个答案:

答案 0 :(得分:18)

通过const A &

您可以通过声明该函数= delete的右值超载来防止意外传递右值。例如:

struct A { };

void func(const A & a) { }
void func(A && a) = delete;

int main()
{
    A a;
    func(a);   // compiles
    func(A()); // doesn't compile
}

答案 1 :(得分:4)

查看std::reference_wrapper的构造函数:http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper/reference_wrapper

它有一个额外删除的构造函数,它接受rvalue引用,所以如果你试图向它传递一个rvalue,那个构造函数会赢得重载分辨率并且你会收到错误。

您可以执行相同的操作:声明const A&A&&构造函数,并删除后者。然后没有人能够传递一个右值。

答案 2 :(得分:-3)

代码:

#include <iostream>
using namespace std;

struct A
{ };

int func_one(A& var) {
    A * insertVal=new A;
    if (&var==nullptr)
        return 0;
    else
        return 1;
}

int main() {
    A refVar;
    int x;
    x=func_one(refVar);

    return 1;
}
相关问题