鉴于以下代码,为什么编译器在构造Bar
时解析隐式转换?也就是说,构造Foo
就像构造a
那样(应该)然后用于构造Bar
?
#include <string>
class ImplicitlyConvertToChar
{
public:
ImplicitlyConvertToChar(const char* a_char)
: m_string(a_char)
{ }
ImplicitlyConvertToChar(const char* a_char, size_t a_end)
: m_string(a_char)
{
}
template <typename T_String>
ImplicitlyConvertToChar(T_String const& a_string)
: m_string(a_string.begin())
{
}
operator char const * () const
{ return m_string; }
const char* m_string;
};
class Foo
{
public:
Foo(const ImplicitlyConvertToChar& a_charLike)
: m_string(a_charLike)
{ }
const char* m_string;
};
class Bar
{
public:
Bar(const Foo& a_foo)
: m_foo(a_foo)
{ }
Foo m_foo;
};
int main()
{
Foo a("this works");
Bar b("Why doesn't this?");
}
答案 0 :(得分:9)
不允许多个用户定义的隐式转换。 Foo
示例涉及一个,Bar
示例涉及两个。
答案 1 :(得分:4)
只允许编译器进行单个隐式用户定义的转换。
请参阅http://en.cppreference.com/w/cpp/language/implicit_cast
A user-defined conversion consists of:
zero or one non-explicit single-argument constructor or non-explicit
conversion function calls
以这种方式构建Bar
需要两个。