为什么显式允许默认构造函数和具有 2 个或更多(非默认)参数的构造函数?

新手上路,请多包涵

我了解具有一个(非默认)参数的构造函数的行为类似于隐式转换器,它将该参数类型转换为类类型。但是, explicit 可用于限定任何构造函数,那些没有参数(默认构造函数)或具有 2 个或更多(非默认)参数的构造函数。

为什么在这些构造函数上允许显式?有没有什么例子可以用来防止某种隐式转换?

原文由 Ashwin Nanjappa 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 369
1 个回答

一个原因当然是因为它不疼。

需要它的一个原因是,如果您有第一个参数的默认参数。构造函数成为默认构造函数,但仍可用作转换构造函数

struct A {
  explicit A(int = 0); // added it to a default constructor
};

C++0x 将它实际用于多参数构造函数。在 C++0x 中, 初始化列表 可用于初始化类对象。哲学是

  • 如果您使用 = { ... } ,那么您使用一种“复合值”来初始化该对象,该“复合值”在概念上表示对象的抽象值,并且您希望转换为该类型。

  • 如果您使用 { ... } 初始化程序,则直接调用对象的构造函数,不一定要指定转换。

考虑这个例子

struct String {
    // this is a non-converting constructor
    explicit String(int initialLength, int capacity);
};

struct Address {
    // converting constructor
    Address(string name, string street, string city);
};

String s = { 10, 15 }; // error!
String s1{10, 15}; // fine

Address a = { "litb", "nerdsway", "frankfurt" }; // fine

通过这种方式,C++0x 表明 C++03 允许显式其他构造函数的决定根本不是一个坏主意。

原文由 Johannes Schaub - litb 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题