如何在std::variant中调用自定义类的正确赋值运算符



我有以下类:

class StackStringHolder
{
public:
StackStringHolder& operator=(const std::string& str)
{
str_ = str;
return *this;
}
StackStringHolder& operator=(std::string&& str)
{
str_ = std::move(str);
return *this;
}
const std::string& get() const { return str_; }
private:
std::string str_;
};

我想以以下方式在std::variant中使用它:

int main() {
std::variant<int, StackStringHolder> var;
var = 5;
std::string str = "Hello";
var = str; // error
var = std::move(str); // error
}

然而编译器(MSVS2022(说:

错误C2679:二进制'=':找不到占用右手的运算符类型为"std::string"的操作数(或者没有可接受的转换(

Update,我确信我的代码已经足够了,但正如我所要求的,这里有一个完整的例子:

#include <string>
#include <variant>
class StackStringHolder
{
public:
StackStringHolder& operator=(const std::string& str)
{
str_ = str;
return *this;
}
StackStringHolder& operator=(std::string&& str)
{
str_ = std::move(str);
return *this;
}
const std::string& get() const { return str_; }
private:
std::string str_;
};
int main() {
std::variant<int, StackStringHolder> var;
var = 5;
std::string str = "Hello";
var = str; // error
var = std::move(str); // error
return 0;
}

问题原因:

您的var可以容纳intStackStringHolder,因此您不能简单地将其分配给std::string

解决方案:

但是,您可以将转换构造函数添加到接受std::string的类StackStringHolder
然后可以将str转换为StackStringHolder,并将其分配给var

您的转换构造函数应该看起来像:

StackStringHolder(std::string const& str)
: str_(str)  {}

现在您可以使用:

var = str;
var = std::move(str);

最新更新