Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以禁止引用对象_C++ - Fatal编程技术网

C++ 是否可以禁止引用对象

C++ 是否可以禁止引用对象,c++,C++,我想做的与使类的实例不可复制相反的事情,也就是说,确保特定类的实例只能作为副本传递,而不能作为引用传递。如果任何函数试图通过引用接收它,我希望它给出编译错误(理想情况下)或运行时错误 我不认为让操作员&私有化可以做到这一点,有没有合法的方法可以做到这一点。这是不可能的。任何命名变量都可以绑定到适当类型的引用变量。这就是语言的工作原理 特别是,您不可能有一个带有您的限制的复制构造函数,因此您实际上无法按值传递对象 我不认为让运营商和私人来做这件事,有没有合法的方法来做这件事 否,因为在传递引用的函

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


我不认为让
操作员&
私有化可以做到这一点,有没有合法的方法可以做到这一点。

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

特别是,您不可能有一个带有您的限制的复制构造函数,因此您实际上无法按值传递对象

我不认为让运营商和私人来做这件事,有没有合法的方法来做这件事

否,因为在传递引用的函数签名中使用的
&
不是运算符。您谈论的是运算符(一元)或按位and运算符(二进制)的地址。因此,它与通过引用传递无关

无法禁止类型的按引用传递

我怀疑你这样做的动机是否足够强烈,而且你似乎对传递机制的理解很差:

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

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

void foo(X x);
按值获取参数
x
。没有办法通过引用来传递它。不可能。同样地:

void foo(X& x)

参考它,而且它总是会的。

这是一个公平的问题,但如果你想这样做的话,它就表明了糟糕的设计。这将禁止您在整个过程中使用此对象时分解大型函数。这是一个有趣的想法,但这基本上与不允许指向此类对象的指针相同,这对我来说似乎非常不合理。@san-一点也不,我经常做类似于
Type&t=*pointerToType以避免篡改指针解引用。只有当传递给计划拥有所有权的功能时,才会破坏其意图,而对于许多功能来说,情况并非如此。@san-有趣的是,C++11提供了一个
std::addressof
函数,即使覆盖或隐藏
&
运算符,也可以提供对象的地址。对于特定对象,可以通过将变量声明为
寄存器来防止获取变量的地址。即
寄存器int a&a是不允许的。但这无助于我们的要求。