我读到 C++ 编译器能够在提供适合转换构造函数或操作数时隐式转换类型。 我实际上找到了看起来很像这样的示例代码:
class Dog{
private:
string name;
public:
Dog(string n):name(n){} //This as the converting constructor
}
int main(){
Dog d = "rover";
}
每当我运行此代码时,编译器都会抛出错误消息:
conversion from ‘const char [6]’ to non-scalar type ‘Dog’ requested Dog d = "rover";
编译时我添加了编译器选项-std=c++11
,所以应该不是C++版本吧?
我在互联网上找到的示例(至少对我而言)看起来非常相似,所以我不知道这里出了什么问题。
我对这个话题的意见来自这个视频:
Convert constructor and overloading operators - thenew moston
最佳答案
您还需要了解您使用的是复制初始化,而不是直接初始化。
They are different ,并且您需要了解如何以及它们与 explicit
的关系.您需要了解 chains of conversions work ,最多涉及一次用户定义的转换。
Dog d1 ("rover");
Dog d2 = "rover";
d2 案例尝试将文字转换为 Dog,然后将其复制(移动)到 d2。但这将是 double 转换:const char*
到 string
然后 string
到 Dog
。
d1 case 构造 d1 将参数传递给构造函数,因此只有一次将 const char*
转换为 string
。 (在这两种情况下,将 const char [6]
提升为 const char*
也在其中,但不计入允许的“唯一一个”,处于不同的类别。)
复制初始化不将“rover”指定为构造函数的参数。它说“这里有东西,但是这里需要一个 Dog
”。 here 是 copy-init 声明语法的右侧,而不是任何可识别的函数。编译器必须找到合法的转换。
在直接初始化的情况下,您只是为函数(构造函数)提供参数。编译器将您提供的内容转换为声明的参数类型。
关于c++ - 如何正确使用转换构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37672921/