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_list4, "foobar" 可能是一个带括号的初始化列表,但祝你好运,找出一个生成类似这样的模板参数。带括号的初始化列表实际上是无类型的。 但是,如果它们是 typeless,在该示例中将其称为“转换构造函数”的使用不是滥用术语吗? (不是一个严肃的问题,真的,我很久以前就学会了不要被那种事情打扰......接受它并继续前进......)

以上是关于C++11 中的“转换构造函数”发生了啥变化? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何检测 SwiftUI 中的 @Published 值发生了啥变化?

周末 Google Directory API 发生了啥变化/中断?

Cocos2d 3.0 中的 3D Action Effects 发生了啥变化?

当实体发生变化时,OpenJPA 对 db 模式做了啥?

运行 Bump Version 时实际发生了啥变化?

比较两个包含对象的数组以计算发生了啥变化?