在下面的示例中,为什么我不能简单地传递一个string
to the printFoo()
?
#include <string>
#include <iostream>
using namespace std;
class Foo {
public:
Foo(const Foo &foo) : str(foo.str) {}
Foo(string str) : str(str) {}
string str;
};
void printFoo(Foo foo) {
cout << foo.str << endl;
}
int main() {
Foo foo("qux");
printFoo(foo); // OK
printFoo("qix"); // error: no matching function for call to 'printFoo'
return 0;
}
无论出于何种原因,我脑子里都会自动确定并使用构造函数来构造对象。
为什么我不能这样做,但我可以通过char[n]
常量接受一个参数std::string
, 例如?
将涉及两个隐式转换:
- to
std::string
- to
Foo
C++ 最多做一件事:
来自 4 个标准转换 (N3337)
标准转换是具有内置含义的隐式转换。
第 4 条列举了完整的此类转换集。一个标准
转换序列是标准转换的序列
以下顺序:
— 来自以下集合的零次或一次转换:
左值到右值转换、数组到指针转换以及
函数到指针的转换。
— 零次或一次转换
以下设置:积分促销、浮点促销、积分
转换、浮点转换、浮点积分
转换、指针转换、指向成员的指针转换,以及
布尔转换。
— 零次或一次资格转换。
另请参阅 12.3 转换 (N3337)
1 类对象的类型转换可以通过构造函数指定
通过转换函数。这些转换称为用户定义的转换
转换并用于隐式类型转换(第 4 条),例如
初始化 (8.5),以及显式类型转换 (5.4、5.2.9)。
2 用户定义的转换仅在明确的情况下应用
(10.2、12.3.2)。转换遵守访问控制规则(第 11 条)。
歧义解决后应用访问控制(3.4)。
[...]
4 最多1个用户自定义
隐式应用转换(构造函数或转换函数)
为单一值。
(强调我的)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)