6

给定以下代码,为什么编译器在构造时不解析隐式转换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?");
}
4

2 回答 2

9

不允许超过一个用户定义的隐式转换。Foo例子涉及一个,例子Bar涉及两个。

于 2013-08-12T15:23:39.017 回答
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需要两个。

于 2013-08-12T15:25:18.147 回答