鉴于以下两个构造函数签名,是否可以使用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>&)
答案 0 :(得分:12)
实际上,转换序列不能包含多个隐式的用户定义转换;标准在C ++ 11 12.3 / 4中指定了这一点:
最多一个用户定义的转换(构造函数或转换函数)隐式应用于单个值。
在您的情况下,需要两个(char const[]
到std::string
到Person
),因此无法进行隐式转换。
答案 1 :(得分:6)
隐式转换存在问题,这是正确的。它只会对一个值进行一次隐式转换,因此您可以执行Couple(std::string("a"), std::string("b"))
或Couple(Person("a"), Person("b"))
,但Couple("a", "b")
需要编译器为每个值进行两次隐式转换。标准不允许这样做,因为它会导致代码可能难以正确理解并且编译成本很高。
答案 2 :(得分:1)
不允许链式隐式转换。如果A
可以隐式转换为B
而B
可以隐式转换为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