c++ - 转换构造函数

标签 c++ constructor type-conversion constants copy-constructor

尝试编译代码:

class Foo
{
    public:
        Foo(Foo&){}
        Foo(int*){}
};

int main()
{
    int i = 2;
    Foo foo = &i;
    return 0;
}

得到这个:

prog.cpp: In function ‘int main()’:
prog.cpp:11:16: error: no matching function for call to ‘Foo::Foo(Foo)’
prog.cpp:11:16: note: candidates are:
prog.cpp:5:9: note: Foo::Foo(int*)
prog.cpp:5:9: note:   no known conversion for argument 1 from ‘Foo’ to ‘int*’
prog.cpp:4:9: note: Foo::Foo(Foo&)
prog.cpp:4:9: note:   no known conversion for argument 1 from ‘Foo’ to ‘Foo&’

我预计 Foo foo = &i 行应该被称为 Foo(int*) c-tor。

为什么编译器会尝试查找 Foo::Foo(Foo) c-tor?

为什么它不直接使用现有的 Foo(int*) c-tor?

为什么当我将 const 添加到第一个 c-tor 的参数时,代码会编译?

为什么当我完全删除第一个 c-tor 时代码会编译?

谢谢!

最佳答案

您的第一个构造函数是一个复制构造函数,不能用于从临时对象复制。为此,您需要添加 const,因此签名变为 Foo(const Foo&)

以下代码也可以编译(对采用 int* 的构造函数的正确调用):

Foo foo(&i);

您的代码在赋值运算符的右侧创建一个(临时)对象 Foo,然后将该对象(使用(缺少的)复制构造函数)分配给 foo.

编译器通常会自动为您生成一个复制构造函数,它采用 const 引用。但由于您定义了一个采用 Foo& 的构造函数,编译器不会为您生成这样的复制构造函数。因此,删除第一个构造函数也会使代码编译。

关于c++ - 转换构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16768524/

相关文章:

c++ - "no ' operator++(int) ' declared for postfix '++ ' [-fpermissive]"枚举

c++ - gdb 错误消息 : DW_OP_reg, DW_OP_piece 和 DW_OP_bit_piece

javascript - Number.[property] 是对象还是构造函数的属性?

string - R:将数据框行转换为字符向量

c++ - Swig 简单类型 typedef 参数

c++ - OpenGL,C++ : Large number of points

c# - 为什么不能在 System.Transactions 命名空间中创建 Transaction 类的实例

java - 自定义异常中的 super 调用

mysql - 如何在MySQL中将位掩码应用于整数?

c++ - Variadic 用户定义的转换/构造函数