转换构造函数的参数可以隐式转换吗?

时间:2019-06-06 22:28:54

标签: c++ constructor implicit-conversion

现在,我正在一个项目中,非常需要两个类(A和B)之间的可转换性。我已经创建了一个函数myFunc(),该函数将A类的对象作为其参数,并将其传递给B类的对象。

我希望它起作用的原因是B可以隐式转换为整数,而A可以隐式构造为整数。我希望发生这两个过程,以便将B类的对象隐式转换为A类的对象。情况并非如此。

当我尝试将B类的对象传递给myFunc()时,出现错误:error: could not convert 'b' from 'B' to 'A'

但是,有趣的是,我可以传入我显式转换为整数的B类对象,或传入以B类对象作为参数的A类显式构造对象。似乎在一行中只能发生一个隐式进程(无论是转换构造函数还是隐式转换)。为什么会这样呢?有什么办法可以解决这个问题?

我知道一个简单的解决方案是在A中创建一个将B类对象作为其参数的构造函数,或者在B中创建一个将B类对象转换为A类对象的运算符。我的目的是,除非绝对必要,否则不应使用这些解决方案。

我仍在学习C ++(我来自Java)。希望下面的代码可以阐明我在说什么。感谢您的提前反馈。

#include <iostream>

// objects of class A can be (implicitly) constructed with an int
struct A {
    A(int) {}
};

// objects of class B can be (implicitly) converted to an int
struct B {
    B(int) {}
    operator int() { return 0; }
};

// myFunc takes an object of class A
void myFunc(A)
{ }

// why can't myFunc convert the argument b like the following: B -> int -> A?
int main()
{
    B b(5);

    // These work:
    myFunc((int) b);
    myFunc(A(b));

    // This does not:
    myFunc(b);
}

注意:上面的代码应正确编译,直到myFunc(b);被注释掉为止。

1 个答案:

答案 0 :(得分:1)

您要查找的内容在C ++中称为转换序列。要从一种类型转换为另一种类型,只能执行有限数量的步骤。重要的是,每种可能的类别中最多只能有一个步骤。例如。您最多可以进行一次数字升迁(例如shortlong。)。重要的是,在您的示例中,最多可以有一个用户定义的转化 转换构造函数Foo::Foo(Bar)转换函数({{1} }。您的示例同时需要。