【问题标题】:Is it possible to disallow taking a reference to an object是否可以禁止引用对象
【发布时间】:2012-11-05 16:17:44
【问题描述】:

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

我不认为将 operator & 设为私有会这样做,是否有合法的方式这样做。

【问题讨论】:

  • 公平的问题,但如果你想这样做,很可能表明设计不好。如果始终使用此对象,这将禁止您分解大型函数。
  • 有趣的想法,但这基本上与禁止指向那种对象的指针相同,这对我来说似乎很不合理。
  • @san - 一点也不,我经常做类似Type& t = *pointerToType; 的事情来避免指针取消引用。如果传递给它的函数计划取得所有权,那么这只会颠覆意图,而对于许多函数来说,情况并非如此。
  • @san - 有趣的是,C++11 提供了一个 std::addressof 函数,即使您覆盖或隐藏了 & 运算符,它也提供对象的地址。
  • 对于特定对象,您可以通过将变量声明为register 来防止获取变量的地址。 IE。 register int a; &a; 是不允许的。但这对这里的要求没有帮助。

标签: c++


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我不认为让 operator & private 会这样做,有没有合法的方式这样做。

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

    无法禁止类型的引用传递

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

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

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

    void foo(X x);
    

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

    void foo(X& x)
    

    通过引用来获取它,并且永远都会这样做。

    【讨论】:

      猜你喜欢
      • 2018-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-24
      • 2012-08-13
      • 1970-01-01
      相关资源
      最近更新 更多