【问题标题】:What changed with "converting constructor"s at C++11? [duplicate]C++11 中的“转换构造函数”发生了什么变化? [复制]
【发布时间】:2021-09-11 00:54:01
【问题描述】:

今天被this paragraph at cppreference惊到了:

转换构造函数

未使用说明符显式声明且可以使用单个参数(C++11)调用的构造函数称为转换构造函数

“(直到 C++11)”位似乎指的是短语“可以用单个参数调用”。

我不知道这在 C++11 发生了变化。有什么变化?什么样的“转换构造函数”可以接受多个参数? (如果这就是它所指的。)

(我想它可能指的是具有多个参数的构造函数,但那些额外的参数 - 或所有参数 - 具有默认值。但参数的默认值一直在 C++ 中。所以那里发生了一些变化 - 之前C++11 你不能用带默认参数的构造函数隐式转换?但this example at wandbolt 表明 确实 在 C++03 中工作。)

【问题讨论】:

  • @GSerg - 我得说,我可以发誓我在 SO 搜索栏中输入了“converting constructor”,但没有看到。也许我应该删除这个问题或 VTC 作为 dup?
  • 不删除is much better
  • @GSerg - 好的!进入了自我VTC。 (你知道,应该有一个徽章......)
  • 这很奇怪;您是否只是简单地投了票,还是在 GSerg 投了票后接受了“这是重复的”建议?如果是后者,我认为问题应该立即结束。 (不过,无论哪种方式都没有徽章;))。

标签: c++ c++11 constructor implicit-conversion


【解决方案1】:

稍后在您引用的页面中给出了一个带有两个参数的示例:

A a4 = {4, 5}; // OK: copy-list-initialization selects A::A(int, int)

【讨论】:

  • 嗯。我没有读那么远。我不认为这会被称为“转换构造函数”。我会认为它被称为“复制列表初始化”......因为,它转换的是什么类型 from
  • 它是从一个大括号初始化列表转换而来的。
  • 所以类型是“std::initializer_list”?好吧,我猜。
  • 不,这不是std::initializer_list{4, "foobar"} 可能是一个带括号的初始化列表,但祝你好运,找出一个生成类似这样的模板参数。带括号的初始化列表实际上是无类型的。
  • 但是,如果它们是 typeless,在该示例中将其称为“转换构造函数”的使用不是滥用术语吗? (不是一个严肃的问题,真的,我很久以前就学会了不要被那种事情打扰......接受它并继续前进......)
猜你喜欢
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
相关资源
最近更新 更多