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…”那么?