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

Rij*_*iju 8 c++ pointers reference rvalue rvalue-reference

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

1)将'a'作为

const A & a_
Run Code Online (Sandbox Code Playgroud)

2)将'a'作为

const A * a_
Run Code Online (Sandbox Code Playgroud)

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

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

我在下面的链接中看到了答案.但我很好奇是否有其他选项而不是该问题中的帖子. 在C++中通过引用传递指针是否有好处?

eml*_*lai 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
}
Run Code Online (Sandbox Code Playgroud)

  • 在处理这个问题时,我遇到了一个棘手的问题:如果你真的想禁用 *所有* 右值,最好使用 `void func(const A&&) = delete;` 来代替。看起来很奇怪而且肮脏,但它确实有效。这是因为否则通过 `const` 值返回的遗留代码(不推荐,但不幸的是经常在类似工厂的函数中使用)将绑定到 `func(const &);`。相关:http://stackoverflow.com/q/33244951/3093378 (2认同)