【问题标题】:Implicit conversions in C++C++ 中的隐式转换
【发布时间】:2013-08-12 15:20:35
【问题描述】:

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

【问题讨论】:

  • 它是标准的一部分,不能像那样链接隐式转换。您只能进行一次隐式转换。

标签: c++ implicit-conversion


【解决方案1】:

您不能使用多个用户定义的隐式转换。 Foo 示例涉及一个,Bar 示例涉及两个。

【讨论】:

    【解决方案2】:

    编译器只允许进行一次隐式用户定义的转换。

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

    【讨论】:

    • 你的开场白不正确。允许编译器进行单个隐式 用户定义 转换。它可以执行尽可能多的隐式标准转换
    • 我希望它不喜欢。
    • @ArmenTsirunyan 感谢您指出这一重要疏忽。答案已更新。
    • @ArmenTsirunyan, en.cppreference.com/w/cpp/language/implicit_cast 声明最多只能执行两次标准转换
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多