c++ - 如何正确使用转换构造函数?

标签 c++ c++11 constructor casting type-conversion

我读到 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 然后 stringDog

d1 case 构造 d1 将参数传递给构造函数,因此只有一次将 const char* 转换为 string。 (在这两种情况下,将 const char [6] 提升为 const char* 也在其中,但不计入允许的“唯一一个”,处于不同的类别。)

复制初始化将“rover”指定为构造函数的参数。它说“这里有东西,但是这里需要一个 Dog”。 here 是 copy-init 声明语法的右侧,而不是任何可识别的函数。编译器必须找到合法的转换。

在直接初始化的情况下,您只是为函数(构造函数)提供参数。编译器将您提供的内容转换为声明的参数类型。

关于c++ - 如何正确使用转换构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37672921/

相关文章:

c++ - 无用(也许是错误的?)gcc 错误消息

c++ - std::array 模板实例会占用更多代码内存吗?

c++ - 使用 for_each 与 range-for 有什么好处?

java - 如何从作为构造函数参数的数组列表中检索项目

c++ - boost 元组是可变的吗?

c++ - 查找参数化数组的大小

c++ - 是否有使用 SSE 查找两个变量模数的好方法? (没有 SVML)

c++ - glDrawPixels 访问违规读取位置

C++ 默认、复制和提升构造函数

java - jsp文件中未定义的构造方法