如果有一个带有通用单个参数的模板构造函数,为什么我必须有一个复制构造函数?

Why must I have a copy constructor if there is a template constructor with a single parameter that is generic?

MISRA 规则 14-5-2 说:

A copy constructor shall be declared when there is a template constructor with a single parameter that is a generic parameter.

我找不到任何足够简单的术语向我解释为什么在这种情况下必须有一个复制构造函数。

我看过 Copy constructor of template classC++ Template constructor, why is copy constructor being called?,但都没有真正帮助我。我看到提到复制构造函数不存在,但默认的构造函数是否仍然被创建?我看到了复制省略的引用,但我不明白为什么复制构造函数是必需的。

据我所知,这可能属于 "good programming practice to watch out for"... 或者可能属于 "you've just entered into undefined behavior land"。 我应该寻找什么来确定违反此 MISRA 规则的代码是否在其当前代码库中造成风险?

除非您编写移动构造函数或移动赋值运算符,否则始终会定义复制构造函数(在 C++11 之前可能已删除或未定义)。如果你不自己声明,它是自动生成的。

现在,我对 MISRA 的了解还不够多,无法确定您提到的规则背后的原因,所以我将猜测它是什么。 如果您有一个带有单个通用参数的模板构造函数,那么您所做的可能不仅仅是简单的复制,您可能会错误地认为所有复制构造都将通过该模板构造函数完成。但是,如果您使用 class 的另一个对象或派生自它的另一个对象复制构造 class 的对象(具有模板构造函数的对象),那么将调用自动生成的复制构造函数,模板版本应该做的额外工作 none 将完成。

简而言之,通过提供复制构造函数,即使同时提供具有单个通用参数的模板构造函数,您也可以确保复制构造始终按预期工作。此外,您明确向 class 的潜在用户表明,除了模板构造函数之外,它还有一个合适的复制构造函数。