【问题标题】:How to overload operator + for const char* and int如何为 const char* 和 int 重载运算符 +
【发布时间】:2014-07-28 02:19:23
【问题描述】:

我知道这既愚蠢又丑陋,但我正在自动迁移一些代码。我的源语言允许字符串和整数之间的隐式转换,例如这是允许的:

var = "hello " + 2
print(var) # prints "hello 2"

如何在 C++ 中为 const char*int 重载 + 运算符?我收到了错误:

错误:'std::string operator+(char* const&, int)' 必须有一个 类或枚举类型的参数

【问题讨论】:

  • 您不能为内置类型重载运算符。
  • 已经有一个内置的+ 运算符用于指针+整数和整数+指针。 "hello" + 2 产生一个指向字符串中第一个 'l' 字符的指针。由于数组索引是根据指针算法定义的,因此允许您隐藏预定义的运算符将非常糟糕。
  • "hello " + std::to_string(2) 没什么特别的问题。
  • 您是否正在从 VB6 迁移到 C++ 并试图保留该代码?不是一个好主意。
  • @vz0 不要,不要,我再说一遍不要超载operator+(std::string, int)。仅重载您拥有的类型的运算符,并且您不拥有 std 中的类型。如果您必须有一个支持+ intstring 类型,请创建自己的具有std::string 字段的类型。

标签: c++ c++11 vb6-migration


【解决方案1】:

你的要求是非法的

为了合法地重载一个运算符,所涉及的至少一个操作数必须是用户定义的类型。因为char*int 都不是用户定义的,所以你想要完成的事情是不可能的。

您正在尝试做的事情是故意且明确地在标准中被禁止的。你不觉得如果突然1+3 = 42 因为某个“聪明人”为operator+(int, int) 定义了重载而感到奇怪吗?


标准是怎么说的? (n3337)

13.3.1.2p1-2 表达式中的运算符 [over.match.oper]

如果表达式中没有运算符的操作数具有类或枚举类型,则假定该运算符是内置运算符并根据第 5 条进行解释。

如果任一操作数的类型为类或枚举,则可能会声明实现此运算符的用户定义的运算符函数,或者可能需要用户定义的转换将操作数转换为适合的类型内置运算符。

( 注意C++03和该标准的下一个修订版中的措辞相同;C++14 )

【讨论】:

  • std::stringint 超载operator+ 是否违反规范?这将为 OP 的需求提供解决方法。
  • @RSahu,我很确定这在技术上是非法的,但我可以看到 C++ 社区无论如何都不喜欢它。
  • @RSahu 查看 Keith Thompson 对该问题的评论
  • @Brian 现在说得通了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 2020-12-23
相关资源
最近更新 更多