【问题标题】:Difference between default (user-defined) constructor and constructor with default arguments?默认(用户定义)构造函数和具有默认参数的构造函数之间的区别?
【发布时间】:2016-02-08 20:07:15
【问题描述】:

用户定义的默认构造函数有什么区别

class Simple
{
public:
    Simple() {}
};

和一个用户定义的构造函数,它接受多个参数,但每个参数都有默认值

class WithDefaults
{
public:
    WithDefaults(int i = 1) {}
};

除此之外,WithDefaults 还可以使用 i 的显式值构造?

具体来说,我想知道,就语言而言,这两个构造函数是否为两者使用完全相同的默认构造函数,或者类的属性之间是否存在细微差别?

换句话说,一个所有参数都有默认值的构造函数在各个方面都是默认构造函数吗?

【问题讨论】:

  • 实际上,我原以为这是重复的,但我在任何地方都找不到答案。
  • 我想这几乎Default parameters with C++ constructors 中得到了回答,但我不确定。
  • 单独来看,我认为这些类是相同的。当考虑到转化时,他们可以采取不同的行动。 @MicorVirus 的第二条评论中的链接进一步解释了这一点。
  • 真棒的问题!我不提供这个作为明确的答案,但根据我的经验,它们总是相同的。
  • 是的,我不关心explicit 这个问题,但需要小心。

标签: c++ constructor language-lawyer default-constructor


【解决方案1】:

当前标准工作草案 N4527 [12.1p4]:

X默认构造函数是类X的构造函数 要么没有参数,要么每个参数都不是 函数参数包有一个默认参数。 [...]

所以是的,第二个类的构造函数是一个完全有效的默认构造函数。


请注意,已发布的 C++11 和 14 版本中的措辞略有不同,但对您的问题没有影响。以前是:

X默认构造函数是类X的构造函数 可以不带参数调用。

由于DR 1630,对当前措辞的更改是为了澄清默认初始化的语义。以前,标准中有提到“默认构造函数”的地方,暗示只能有一个;当前的措辞旨在支持更复杂的场景,在这些场景中,您可能有多个这样的构造函数(例如使用 SFINAE),并且使用正常的重载决议来选择使用的构造函数。

【讨论】:

  • 虽然在考虑 ABI 兼容性方面存在一点差异。
  • @Deduplicator 好点,但我想这属于一般声明“可以使用与没有任何参数的函数相同的语法调用具有所有参数的默认参数的函数,但是这并不意味着这两个函数具有相同的签名”。
猜你喜欢
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
相关资源
最近更新 更多