初始化引用时避免按值复制

时间:2011-04-27 21:14:46

标签: c++ default-copy-constructor return-by-reference

我有一个功能界面:

struct iFace {
  virtual Type& getType() = 0;
}

并且想法是检索它:

iFace& iface = getIface();
Type& type = iface.getType();

然而,我偶尔会犯错误并写道:

Type type = iface.getType();

按值复制,这​​是我想要避免的。但是,当我犯这样的错误时,编译器不会发出警告,因为它的法律语法。我想为此触发编译时错误,问题我的替代方案是什么?

我考虑过声明一个复制构造函数,但没有在任何地方定义它,如果使用它会导致链接时错误,但是我将无法在 ANY 情况下使用复制构造函数,不太可以理解

2 个答案:

答案 0 :(得分:8)

通过将复制构造函数和赋值运算符放在“private”下来使iFace不可复制。然后提供一个显式的Copy方法。

class Type {
public:
  virtual Copy(Type& dest) = 0;
private:
  Type (const Type &) {assert(false)}
  Type & operator=(const Type &)  {assert(false)}
}

您也可以使用boost noncopyable执行相同的操作(如上所述)。

因此,如果您希望复制代码,则可以执行

Type& type = iface.getType();
Type typeCpy;
type.Copy(typeCpy);

顺便说一句 - 我补充一点,如果你因为性能问题而这样做,你确定优化器不会为你删除临时副本吗?

答案 1 :(得分:-1)

在这里返回一个指针似乎是合理的,但如果令人困惑的所有权让你担心,你可以在引用周围返回一个包装器。

struct Class {
    struct Ref {
        Ref(Class& c_) : c(c_) { }
        Class Clone() { return c; }
        // overload -> to provide access to c
      private:
        Class& c;
    };
};

原始类可以正常复制,但您必须明确地进行引用。我并不热衷于这个想法(我认为较少的用户没有意识到复制语义是如何工作的,而不是那些意外地持有其中一个太久的人)但理论上它是可行的。