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

C++ 在C+中构造对象时使用两个隐式强制转换是否有效+;?,c++,constructor,implicit-conversion,C++,Constructor,Implicit Conversion,给定以下两个构造函数签名,是否可以使用Couple(“George”、“Nora”)构造Couple?我的编译器出现如下错误。如果我用Couple(std::string(“George”)、std::string(“Nora”))调用它它编译得很好。我猜隐式转换存在一个问题,这让我感到惊讶,因为我认为char*到string就可以了 class Person { public: Person(const std::string& name); }; class

给定以下两个构造函数签名,是否可以使用
Couple(“George”、“Nora”)
构造
Couple
?我的编译器出现如下错误。如果我用
Couple(std::string(“George”)、std::string(“Nora”))调用它
它编译得很好。我猜隐式转换存在一个问题,这让我感到惊讶,因为我认为char*到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>&)
班级人员
{
公众:
人员(const std::字符串和名称);
};
阶级夫妇
{
公众:
坐标(const Person&p1,const Person&p2,const Optional&=Optional());
};
TestCouple.cpp:69:错误:调用'Couple::Couple(const char[7],const char[5])时没有匹配的函数
TestCouple.h:24:注意:候选项是:Couple::Couple(constperson&,constperson&,constoptional&)

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

不允许链式隐式转换。如果
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
//给定三个对象作为
A A;
B'
C C;
//处所
b=a//a可以转换为b(隐式)
c=b//b可以转换为c(隐式)
//那就不是这样了
c=a//a无法转换为c(隐式)
//你至少需要写下这个
c=静态铸件(a)//好啊

事实上,一个转换序列不能包含多个隐式用户定义转换;本标准在C++11 12.3/4中对此进行了规定:

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


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

我看不出问题,它应该可以工作。你应该发布完整的最小测试。
Coordinate
是打字错误吗?如果不是“代码>夫妇< /代码>,那么C++中就没有这样的“隐式转换”了。强制转换是使用特殊强制转换语法的显式转换请求。你所追求的是隐式转换。“那么这并不意味着A可以隐式转换成C。”这是正确的。吹毛求疵:声明“
b=a
有效”与声明“a可以转换为b”并不等同。@curiousguy:解释你在说什么。为什么
b=a
在这里首先是有效的?假设b是类类型,
b=a
是有效的iff重载解析可以为
b找到一个最佳匹配。运算符=(a)
。你也可以写
foo(a,b)
,对于
foo
的适当重载@curiousguy:你应该正确地阅读我的答案。我说:如果
A
可以隐式转换为
B
,“你应该正确地阅读我的答案。”我说了。“如果A可以隐式转换为B…”那么?