C ++中的隐式转换

时间:2013-08-12 15:20:36

标签: c++ implicit-conversion

鉴于以下代码,为什么编译器在构造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?");
}

2 个答案:

答案 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需要两个。