【问题标题】:(No) Type casting while calling overloaded operators(否)在调用重载运算符时进行类型转换
【发布时间】:2017-11-20 21:32:14
【问题描述】:

我想知道在初始化/比较对象与特定类型的变量时是否有禁用 (?) 类型转换的选项:

class X {
  //...
  const bool operator<=(const long long val) const;
  const bool operator<=(const char* val) const;
  const X& operator=(const long long val);
  const X& operator=(const char* val);
}

int main() {
  X x1 = 10;                //thats ok
  X x2 = "123";             //ok again
  X x3 = 0;                 //error, 0 is 'valid' char* 
  x1 <= 0 ? true : false;   //error, same reason
}

这是错误:more than one operator "&lt;=" matches these operands

有没有办法摆脱这些错误? 我知道我可以输入main,但不幸的是这不是我想要的,或者实际上什至不允许这样做:

X x3 = (long long)0; //no no no...

另外 - 没有std::string


回答(部分) 所以赋值部分可以通过改变类声明来解决 - 摆脱long long赋值并使适当的构造函数显式/隐式

// allow implicit conversion from long long, ex. X x = 13;
X(long long val)

// disable implicit conversion from const char*, now X x = 0 is ok - calls the above
explicit X(const char* val); 

// allow assignment from const char as well, no confusion with 0 now
const X& operator=(const char*);

【问题讨论】:

  • 如果您可以摆脱赋值运算符并用explicit constructors 替换它们,您将摆脱错误。但是,不可能有明确的分配。
  • 谢谢@RainingChain ,@a-a 我按照您的建议运行了作业,但仍然没有正确设置&lt;= 运算符,您还有其他建议吗?还是我还缺少什么?
  • 添加一个采用int 的重载。 0 更喜欢 char*
  • 后缀是一个选项吗?例如。 X x3 = 0ll;

标签: c++11 casting operator-overloading c-strings


【解决方案1】:

调用不明确的原因是两个重载具有相同的标准转换等级,根据 14882:2011 ISO C++ 标准中 13.3.3.1.1 [over.ics.scs] 下的表 12。 0 文字的类型为 int。到long long 的转换是整数转换(参见4.7),到const char* 的转换是指针转换(参见4.10)。

最简单的解决方案是为int 添加重载。您可以通过将参数强制转换为long long 来简单地调用相应构造函数/运算符的long long 版本,如下所示:

class X
{
public:
    // ...

    X(int i) : X((long long)i) { }
    const X& operator=(int i) { return operator=((long long)i); }
    // etc
};

您的部分解决方案“有效”,尽管您的示例中 main() 的第二行将不再编译。因为来自const char* 的转换是显式的,所以不再允许您这样做:

X x = "Hi there!"; // error: no implicit conversion from const char[10] to X
X x("Hi there!");  // ok

另一个需要注意的是,使用 long long 的操作可能会很昂贵,具体取决于您对 X 的实现,因为在进行分配/比较/等之前需要先构造一个临时 X。

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 2013-11-21
    • 1970-01-01
    • 2014-09-08
    • 2011-01-15
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多