米斯拉规则第14-5-2条规定:
当模板构造函数具有单个参数(即泛型参数)时,应声明副本构造函数。
我找不到任何东西可以简单地向我解释为什么在这种情况下必须有一个副本构造函数。
我看过Copy constructor of template class和C++ Template constructor, why is copy constructor being called?,但都没有真正帮助我。我看到提到的是,复制构造函数将不存在,但是默认的构造函数不是仍然被创建吗?我看到了复制省略的引用,但我不明白为什么复制构造函数是必要的。
据我所知,这可能属于“注意的好的编程实践”.也可能是“你刚刚进入了未定义的行为土地”。我应该寻找什么来确定违反MISRA规则的代码是否会在其当前的代码库中造成风险?
发布于 2018-11-01 07:04:50
除非您编写移动构造函数或移动赋值操作符,否则复制构造函数总是被定义的(可能是删除的,或者是C++11之前未定义的)。如果你不自己声明它,它是自动生成的。
现在,我对MISRA还不太了解,无法确定你提到的规则背后的推理,所以我来猜猜它是什么。如果您有一个具有单个和泛型参数的模板构造函数,那么您可能要做的不仅仅是一个简单的副本,而且您可能错误地认为所有的复制构造都将通过这个模板构造函数来完成。但是,如果您使用同一个类的另一个对象或从该类派生的对象来复制该类的对象(带有模板构造函数的对象),那么自动生成的复制构造函数将被称为,模板版本应该做的额外工作都不会完成。
简而言之,通过提供一个拷贝构造函数,即使同时还提供了一个具有单个和泛型参数的模板构造函数,您也可以确保复制结构始终按预期工作。此外,您还显式地向类的潜在用户展示了除了模板构造函数之外,它还有一个正确的复制构造函数。
https://stackoverflow.com/questions/53095745
复制相似问题