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

4

コンパイラは、ユーザー定義の暗黙的な変換を 1 つだけ行うことができます。

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そのように構築するには、2 つ必要です。

于 2013-08-12T15:25:18.147 に答える