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代码>是不允许的。但这无助于我们的要求。