我有一个函数接口:

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

这个想法是像以下方式检索:

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

但是,我偶尔会犯一个错误并写下:

Type type = iface.getType();

哪个是按价值复制的,这是我要避免的。但是,当我犯此类错误时,编译器不会发出警告,因为其法律语法。我想为此触发编译时错误, 问题 我的选择是什么?

我考虑过声明复制构造函数,但没有在任何地方定义它,如果使用它,会导致链接时间错误,但是我将无法在 任何 情况,这是不值得的

有帮助吗?

解决方案

通过将复制构造函数和分配运算符放在“私人”下,使IFACE不可复制。然后提供明确的复制方法。

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

您也可以使用 提升不可复制 做同一件事(其实现如上)。

因此,如果您希望代码复制,您会做

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

顺便说一句 - 我补充一点,如果您是由于性能问题而这样做的,您是否确定优化器不会为您摆脱临时副本吗?

其他提示

在这里返回指针似乎很合理,但是如果所有权令人困惑,您可以在参考文献周围返回包装器。

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

原始类可以正常复制,但是您必须明确进行参考。我对这个想法并不热衷(我认为没有意识到复制语义是如何工作的用户要比不小心坚持其中一个太长的人的工作方式),但是从理论上讲,这是可行的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top