对于std :: string,'operator ='是不明确的

Sim*_*man 8 c++ c++11

我试图写一个类,我自己投运营商,但我有多个问题operator=小号

我设法用下面的小代码重现了这个问题

#include <string>

class X
{
public:
  operator const char*() const {
    return "a";
  }
  operator std::string() {
    return "c";
  }
};

void func( )
{
  X x;
  std::string s = "";
  s = x;
}
Run Code Online (Sandbox Code Playgroud)

我知道std::basic_string有多个赋值运算符,这就是编译器混淆的原因.

如果我删除任何一个强制转换运算符,它可以工作,但我想知道是否有一种方法可以保留两个运算符.

我的班级将根据演员表返回不同的值.

我也可以使用static_cast<std::string>(x)强制演员,但我想知道是否有一种方法可以在没有静态演员的情况下进行演绎?

Qix*_*Qix 2

正如 KerrekSB建议的那样,您可以使用

s = std::string(x);
Run Code Online (Sandbox Code Playgroud)

或者,您可以执行强制转换:

s = (std::string) x;
// or
s = static_cast<std::string>(x);
Run Code Online (Sandbox Code Playgroud)

第三种选择(由于可读性问题,我希望不要经常看到)是直接访问操作符:

s = x.operator std::string();
Run Code Online (Sandbox Code Playgroud)

如果您愿意权衡稍微不同的 API(并修复任何潜在的损坏),您可以按照 Roberto 的建议进行操作,并强制显式转换类型const char *运算符:

class X
{
public:
  explicit operator const char*() const {
    return "a";
  }
  operator std::string() {
    return "c";
  }
};
Run Code Online (Sandbox Code Playgroud)

这告诉编译器只允许隐式转换为,并要求您在想要调用该特定运算符时std::string显式转换为。const char *


最后要注意的一点是:如果您正在设计将使用此特定类的其他类或方法,则要尝试的另一件事是通过提供重载而class X不是转换X为其他内容来反转它们的使用方式。

考虑 API 的工作替代方式总是好的。