C++ 如何防止拷贝省略?

C++ 如何防止拷贝省略?,c++,C++,我有一个名为sfract的类,它存储指向二叉树根节点的指针。显然,在复制构建一个sfract时,我需要克隆另一个sfract对象的二叉树。但是,我认为,由于复制省略,从未调用复制构造函数。这会导致两个sfract对象在解构时引用并尝试取消分配同一根节点。我怎样才能防止这种情况发生 //main.cpp sfract_type a( /*...*/ ); sfract_type b( /*...*/ ); sfract_type c( a ); // copy construct //sfrac

我有一个名为
sfract
的类,它存储指向二叉树根节点的指针。显然,在复制构建一个
sfract
时,我需要克隆另一个
sfract
对象的二叉树。但是,我认为,由于复制省略,从未调用复制构造函数。这会导致两个
sfract
对象在解构时引用并尝试取消分配同一根节点。我怎样才能防止这种情况发生

//main.cpp
sfract_type a( /*...*/ );
sfract_type b( /*...*/ );
sfract_type c( a ); // copy construct

//sfract.h
template< class FType, class Alloc >
sfract( sfract< FType, Alloc > const & other )
{
    // Clone other's root node and assign to this object
    root = other.root->clone();
}
//main.cpp
sfract_类型a(/*…*/);
sfract_类型b(/*…*/);
sfract_类型c(a);//复制构造
//sfract.h
模板
sfract(sfractconst&other)
{
//克隆他人的根节点并分配给此对象
root=other.root->clone();
}

我看不到您的代码,但是您的模板构造函数不会优先于默认的复制构造函数,因此在FType和Alloc与类的FType和Alloc匹配的情况下,将调用默认构造函数

您有两个选择:

  • 这也太过分了
  • 从管理复制/克隆部分的非模板基类派生模板(可能受保护)。这通常会更好,因为只有一个类管理“根”成员

  • 当然,由于您正在重载复制构造函数,请确保赋值运算符(以及析构函数)也得到了正确处理。

    哪个编译器?GCC有一个标志,我认为Clang使用的是同一个。很不幸,VS2010。我认为它与复制省略无关。你能显示一个复制省略吗?复制省略使返回的对象就地构造而不是复制,它不应该具有你提到的效果。请发布一段最短的代码来重新处理您的问题。您的模板复制构造函数将涵盖FType和Alloc与您的类不同的情况,但如果它们相同,将调用您的默认复制构造函数。我也要覆盖它,这就解决了。不知道为什么我忘了添加默认的复制构造函数。谢谢:)