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

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

我有一个函数接口(interface):

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

想法是像这样检索它:

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

然而,我偶尔会写错:

Type type = iface.getType();

按值复制,这​​是我想避免的。然而,当我犯这样的错误时,编译器不会发出警告,因为它的语法是合法的。我想为此触发一个编译时错误,问题我有什么选择?

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

最佳答案

通过将复制构造函数和赋值运算符置于“私有(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);

顺便说一句——我想补充一点,如果您是出于性能考虑而这样做,您确定优化器不会为您删除临时拷贝吗?

关于c++ - 初始化引用时避免按值复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5810681/

相关文章:

C++ 检测输入重定向

c++ - 从命令提示符运行程序并在 C++ 中使用 argv

c++ - 扩展枚举类型

C++ 返回值、引用、常量引用

C++:如何制作作为引用返回的 char 的拷贝?

c++ - 让 SFINAE 在重载函数对象上使用 `is_callable`

c++ - 具有自动默认和移动构造函数的不可复制类

c++ - 未声明的复制构造函数是否自动内联?

C# 结构的自动深拷贝

Java 对象属性的值传递解决方法