带默认参数的复制构造函数

发布于 2024-08-31 20:27:12 字数 172 浏览 9 评论 0原文

据我所知,复制构造函数必须采用 T(const T&)T(T&) 形式。如果我想向签名添加默认参数怎么办?

T(const T&, double f = 1.0);

这符合标准吗?

As far as I know, the copy constructor must be of the form T(const T&) or T(T&). What if I wanted to add default arguments to the signature?

T(const T&, double f = 1.0);

Would that be standards compliant?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

小ぇ时光︴ 2024-09-07 20:27:12

是的。

§[class.copy]/2:

X的非模板构造函数是一个复制构造函数,如果它的第一个参数是X&类型,const X&易失性 X&const 易失性 X&,并且要么没有其他参数,要么所有其他参数都有默认参数 [ 示例: X::X(const X&)X::X(X&,int=1) 是副本构造函数。


Yes.

§[class.copy]/2:

A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&, volatile X& or const volatile X&, and either there are no other parameters or else all other parameters have default arguments [ Example: X::X(const X&) and X::X(X&,int=1) are copy constructors.

最佳男配角 2024-09-07 20:27:12

您可以只创建两个不同的构造函数:

T(const T&)
T(const T&,double)

但是,您所拥有的可以作为复制构造函数。

顺便说一句,我发现在 C++ 中使用默认参数通常不是一个好主意,而使用重载会更好,其中参数较少的参数使用默认值调用参数较多的参数(当然,这对于 ISO C++ 2003 中的构造函数是不可能的,但在 ISO C++ 201x 中允许委托构造函数。这样做的原因是默认值给你的函数提供了与其表面行为不同的实际签名,这使得在获取指向函数的指针时变得有些困难/痛苦。通过提供重载,可以获取每种可能的调用类型的函数指针,而不需要任何类型的“绑定”机制来使其工作。

You can just create two different constructors:

T(const T&)
T(const T&,double)

However, what you have is permitted as a copy constructor.

On a side note, I have discovered that it is generally not a good idea to use default parameters in C++, and it is instead much better to use overloads, where the ones with fewer parameters invoke the ones with more parameters, using default values (of course that isn't possible with constructors in ISO C++ 2003, but delegating constructors are permitted in ISO C++ 201x). The reason for this is that default values give your functions different actual signatures than their apparent behavior, making it somewhat difficult/painful when taking the pointers to the functions. By providing overloads, function pointers of each possible invocation type can be taken without requiring any sort of "binding" mechanism to make it work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文