【问题标题】:C++: non-temporary const referenceC++:非临时常量引用
【发布时间】:2011-05-31 09:03:52
【问题描述】:

我需要编写一个类,它的构造函数接受一个对象的常量引用并将其存储在本地。

为了避免我可以预见的最常见错误,我想只接受对非临时性的引用(即:对左值的引用)。

我怎样才能编写一个只对非临时对象进行常量引用的函数?


当然,即使是非临时引用也可能超出范围,从而破坏我的类行为,但我相信通过禁止临时引用可以避免大多数错误。

【问题讨论】:

  • 你认为你为什么会避免大多数这样的错误?
  • 好吧,我需要传递其引用的对象在实例化后不需要使用(即:我只是实例化对象并传递它,因此由于我的代码风格,我不会在堆栈上实例化它)。如果我忘记了其他类的构造函数需要一个 permanent 值,我希望看到会记住我的临时拒绝(即:编译时间错误)。

标签: c++ reference constants temporary


【解决方案1】:

如果你要存储一个引用并且需要在构造函数完成后使用它,构造函数最好带一个指针:

struct C {
    C(const X* p) : p_(p) { }

    const X* p_;
};

这样,几乎可以保证您不会有指向临时对象的指针(除非 X 做了一些非常愚蠢的事情,比如重载一元 & 以返回 this)。

如果构造函数采用指针,类的用户也更清楚他们需要注意他们传递给构造函数的X对象的生命周期。

【讨论】:

  • 是的,同意,清洁和智能的解决方案!我还将断言p 不为空,并将其存储为引用。
  • 同意,OP 应该知道指针更好!仅在绝对必要时使用引用(例如在复制构造函数中)。
  • @Yttrill:不,这根本不是我想说的。引用非常有用,当人们可以选择使用引用或指针时,应该首选引用。但是,在某些情况下,引用要么根本不起作用(例如,引用不能是可分配类的成员),要么不能正常工作(例如 OP 的场景)。
  • @GManNickG:按照惯例,如果被调用者要求对象的生命周期超过称呼。如果参数是引用,那么在不考虑生命周期管理的情况下调用函数太容易了。如果参数是指针,则表明您需要调查生命周期约束。
  • 6 年后:),但我可以举个例子吗? p 是动态分配的对象吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
相关资源
最近更新 更多