C++11 中的“转换构造函数”发生了啥变化? [复制]
Posted
技术标签:
【中文标题】C++11 中的“转换构造函数”发生了啥变化? [复制]【英文标题】: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 中工作。)
【问题讨论】:
***.com/a/15077788/11683? @GSerg - 我得说,我可以发誓我在 SO 搜索栏中输入了“converting constructor”,但没有看到。也许我应该删除这个问题或 VTC 作为 dup? 不删除is much better! @GSerg - 好的!进入了自我VTC。 (你知道,应该有一个徽章......) 这很奇怪;您是否只是简单地投了票,还是在 GSerg 投了票后接受了“这是重复的”建议?如果是后者,我认为问题应该立即结束。 (不过,无论哪种方式都没有徽章;))。 【参考方案1】:稍后在您引用的页面中给出了一个带有两个参数的示例:
A a4 = 4, 5; // OK: copy-list-initialization selects A::A(int, int)
【讨论】:
嗯。我没有读那么远。我不认为这会被称为“转换构造函数”。我会认为它被称为“复制列表初始化”......因为,它转换的是什么类型 from? 它是从一个大括号初始化列表转换而来的。 所以类型是“std::initializer_list”?好吧,我猜。 不,这不是std::initializer_list
。 4, "foobar"
可能是一个带括号的初始化列表,但祝你好运,找出一个生成类似这样的模板参数。带括号的初始化列表实际上是无类型的。
但是,如果它们是 typeless,在该示例中将其称为“转换构造函数”的使用不是滥用术语吗? (不是一个严肃的问题,真的,我很久以前就学会了不要被那种事情打扰......接受它并继续前进......)以上是关于C++11 中的“转换构造函数”发生了啥变化? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何检测 SwiftUI 中的 @Published 值发生了啥变化?
周末 Google Directory API 发生了啥变化/中断?