5

给定以下两个构造函数签名,是否可以构造 a Couplewith Couple("George", "Nora")?我的编译器抱怨如下所示的错误。如果我用它来调用它,Couple(std::string("George"), std::string("Nora"))它就可以编译。我猜隐式转换存在问题,这让我感到惊讶,因为我认为 char* 到字符串会很好。

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>&)
4

3 回答 3

12

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

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

在您的情况下,需要两个(char const[]to std::stringto Person),因此不可能进行隐式转换。

于 2012-06-25T11:57:05.717 回答
6

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

于 2012-06-25T11:55:47.567 回答
1

不允许链式隐式转换。如果Acan 隐式转换成BBcan 隐式转换成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
于 2012-06-25T11:56:27.630 回答