在C ++中构造对象时有两个隐式转换是否有效?

时间:2012-06-25 11:50:34

标签: c++ constructor implicit-conversion

鉴于以下两个构造函数签名,是否可以使用Couple构造Couple("George", "Nora")?我的编译器抱怨下面显示的错误。如果我用Couple(std::string("George"), std::string("Nora"))调用它,它就可以编译好了。我猜测隐式转换存在一个问题让我感到惊讶,因为我虽然char * to string也没关系。

class Person
{
    public:
        Person(const std::string& name);
};

class Couple
{
    public:
        Coordinate(const Person& p1, const Person& p2, const Optional<Person>& = Optional<Person>());
};

TestCouple.cpp:69: error: no matching function for call to `Couple::Couple(const char[7], const char[5])'
TestCouple.h:24: note: candidates are: Couple::Couple(const Person&, const Person&, const Optional<fox::Person>&)

3 个答案:

答案 0 :(得分:12)

实际上,转换序列不能包含多个隐式的用户定义转换;标准在C ++ 11 12.3 / 4中指定了这一点:

  

最多一个用户定义的转换(构造函数或转换函数)隐式应用于单个值。

在您的情况下,需要两个(char const[]std::stringPerson),因此无法进行隐式转换。

答案 1 :(得分:6)

隐式转换存在问题,这是正确的。它只会对一个值进行一次隐式转换,因此您可以执行Couple(std::string("a"), std::string("b"))Couple(Person("a"), Person("b")),但Couple("a", "b")需要编译器为每个值进行两次隐式转换。标准不允许这样做,因为它会导致代码可能难以正确理解并且编译成本很高。

答案 2 :(得分:1)

不允许链式隐式转换。如果A可以隐式转换为BB可以隐式转换为C,那么这并不意味着A可以隐式转换为C. }}

//given three objects as
A a;
B b'
C c;

//premises 
b = a; //a can convert into b (implicitly)
c = b; //b can convert into c (implicitly)

//then it does not follow this
c = a; //a CANNOT convert into c (implicitly)

//you need to write this at least
c = static_cast<B>(a); //ok