禁用非POD类的默认构造函数

时间:2010-11-23 11:19:27

标签: c++ visual-c++ constructor copy warnings

据我所知,当类是POD类时,C ++默认复制构造函数的行为与预期一致。

我想知道是否存在阻止程序员编写代码的解决方案(如果对象不是POD,则隐含或不利用)使用默认的复制构造函数。

我知道您可以随时将您的副本和分配私有化以解决此问题,但我想知道是否有自动解决方案。例如,如果您的代码生成默认的复制构造函数调用且您的类不是POD,编译器可能会生成警告?

此处的目标是检测我忘记声明复制/分配私有或手动定义它们的情况。

你们也知道cppcheck能做到吗?

4 个答案:

答案 0 :(得分:3)

在C ++ 0x中,你可以明确地阻止使用像这样的特殊成员函数:

struct NonCopyable {
    NonCopyable & operator=(const NonCopyable&) = delete;
    NonCopyable(const NonCopyable&) = delete;
    NonCopyable() = default;
};

有关详细信息,请参阅here。不幸的是仍然手动,但比现在更优雅。

答案 1 :(得分:2)

不,因为这是语言的要求。

答案 2 :(得分:2)

创建一个类时,你有三种可能:拥有默认的copy ctor,编写你自己的或者禁用它(用不同的方法来实现它;继承自boost::noncopyable提到一个)。不清楚为什么编译器应该警告你选择其中一个。

答案 3 :(得分:2)

禁用默认构造的集中方法是使默认构造函数不可访问。

你写道:“我想知道是否有一个解决方案可以阻止程序员编写代码(如果对象不是POD,则隐含或不利用)使用默认的复制构造函数。”

大概你的意思是你希望编译器对任何非POD对象的任何默认构造作出反应。

抱歉,没有与编译器无关的方式。

原因:许多非POD类,如智能指针和容器(如std::vector)依赖于默认构造非常有用。

g ++编译器有一个选项-Weffc++来警告违反Scott Meyers的 Effective C ++ 中的指南,但据我所知 - 我可能错了 - 这不是包括你的情况。据说可以说是有用的。

干杯&第h。,