【问题标题】:c++ implicitly convert function arguments via custom assignment operatorc++ 通过自定义赋值运算符隐式转换函数参数
【发布时间】:2020-09-24 11:01:27
【问题描述】:

我正在做一个项目,其中部分是 C 编写的,部分是 C++ 编写的。

我得到了 2 个基本上代表相同的枚举,但是一个被包装在一个类中,另一个由于 C 兼容性而位于全局命名空间中。

//C Code File
typedef enum
{
  C_Enum_first = 0,
  C_Enum_Second,
} C_Enum_T
//(obviously) C++ Code file
class CMyClass
  {
  public:
    enum class CPP_Enum
    {
      first= 0,
      second,
    };

    CPP_Enum& operator= ( const C_Enum_T& rhs);
}

现在我在全局命名空间范围内有一个函数,它以 Cpp 枚举作为参数

bool FooFunc(const CMyClass::CPP_Enum value);

但是由于与 C 代码的兼容性问题,在某些地方会使用 C 枚举值调用此函数

bool res = FooFunc(C_Enum_Second);

这给了我一个未知的转换错误。 是的,我知道我可以重载,但出于演示目的,我只展示了 1 个枚举参数。实际上,有 3 个枚举会增加我需要的重载。 为什么我的赋值运算符没有被调用?赋值运算符不能隐式作用于函数参数吗?

感谢您的帮助

问候朱利安 :)

【问题讨论】:

  • 对于从一种类型到您的类的隐式转换,您需要一个非显式的构造函数,而不是赋值运算符。

标签: c++ assignment-operator


【解决方案1】:

赋值运算符不能隐式作用于函数参数吗?

您的operator=CMyClass 的成员。可以这样调用:

CMyClass cmc;
C_Enum_t a;
CPP_Enum& x = (cmc = a);

但不会考虑将 CMyClass 隐式转换为 CPP_Enum。考虑改为使用免费函数进行转换。同样,您的 operator= 返回参考也很可疑。您没有包含实现,但返回引用看起来不正确。应该指什么?

【讨论】:

  • 谢谢你可能会说我的运算符返回一个引用,因为 Cpp Reference 提供了这种语法en.cppreference.com/w/cpp/language/copy_assignment 我所有的复制/移动赋值运算符也返回一个引用。这是错的吗?
  • @JHeni 通常操作符返回对this 的引用,这完全没问题,但在这种情况下,返回的引用指的是什么并不清楚,因为调用它的对象不是@987654329 @.
猜你喜欢
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多