据我所知,当类是POD类时,C ++默认复制构造函数的行为与预期一致。
我想知道是否存在阻止程序员编写代码的解决方案(如果对象不是POD,则隐含或不利用)使用默认的复制构造函数。
我知道您可以随时将您的副本和分配私有化以解决此问题,但我想知道是否有自动解决方案。例如,如果您的代码生成默认的复制构造函数调用且您的类不是POD,编译器可能会生成警告?
此处的目标是检测我忘记声明复制/分配私有或手动定义它们的情况。
你们也知道cppcheck能做到吗?
答案 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。,