确保在移动构造函数存在时永远不会调用复制构造函数

时间:2012-10-19 11:58:29

标签: c++ c++11 copy-constructor move-semantics

在设计可移动但未复制的类时,将复制构造函数声明为私有是很自然的。当只有可移动和平凡的可复制对象作为实例成员时,允许编译器隐式生成移动构造函数是有意义的。

然而,当支持VS11和G ++ 4.7时,我发现了不兼容性:

  • VS11需要明确定义的移动构造函数
  • G ++要求显式移动构造函数使匹配公共复制构造函数或noexcept关键字
  • VS11不支持noexcept关键字。

正如你所看到的,这让我陷入了困境。我的班级不得复制。我必须支持 VS11和MinGW / GCC。我需要我的班级才能移动。

我是否误解了某些问题,或者是否有解决这个小问题的方法?如果生成对复制构造函数的调用,是否可以使编译失败?对这个问题有什么更好的解决方案吗?

1 个答案:

答案 0 :(得分:4)

如果将其添加到源文件

#ifdef _MSC_VER
#define noexcept
#endif

您可以在GCC上将其定义为noexcept,但VC ++将忽略noexcept