17

我想做与创建类的实例相反的事情noncopyable,即确保特定类的实例只能作为副本而不是作为引用传递。如果任何函数试图通过引用接收它,我希望它给出编译错误(理想情况下)或运行时错误。

我不认为operator &私有化会这样做,是否有合法的方式来做到这一点。

4

2 回答 2

22

这不可能。任何命名变量都可以绑定到适当类型的引用变量。这就是语言的工作方式。

特别是,你永远不可能有一个有你的限制的复制构造函数,所以你实际上不能按值传递对象!

于 2012-11-05T16:23:00.383 回答
7

我认为将运营商和私有化不会这样做,是否有合法的方式来做到这一点。

不,因为&您在函数签名中用于传递引用的不是运算符。您说的是地址运算符(一元)或按位与运算符(二进制)。所以它与传递引用无关。

没有办法禁止 type 的传递引用

我怀疑你的动机是否足够强大,并且你似乎对传递机制有一个不好的理解:

如果任何函数试图通过引用接收它,我希望它给出编译错误(理想情况下)或运行时错误。

函数要么通过引用传递参数,要么通过值传递。它是由它的声明决定的,我认为你的困惑源于这里。例如:

void foo(X x);

按值获取参数x。没有办法通过引用传递它。没门。同样地:

void foo(X& x)

引用它,它总是会的。

于 2012-11-05T16:27:22.323 回答