我在尝试将具有常量的
结构
成员分配给映射时遇到了一个问题。
struct test {
const int& number;
test(const int& cnumber) : number(cnumber) {}
test(const test&) = default;
test& operator=(const test&) = default;
};
int main ... {
std::map<std::string, test> testmap;
testmap["asd"] = test(2);
}
运行此代码会导致错误C2280'test&test::operator=(const test&)':尝试引用已删除的函数
有谁能向我解释一下这里的问题是什么? 这是一个最小的可复制的例子。 在我的实际项目中,数据要大得多,因此按值传递是不明智的。
引用不可赋值。 因此,编译器提供的默认运算符=
被隐式删除。 即使你有
test& operator=(const test&) = default;
这里的“default”operator=
是一个已删除的运算符,因此您仍然没有运算符。 您要么不需要使用引用,要么编写自己的运算符=
来执行您想要的操作。
由于您有引用成员,test
类型默认情况下是不可赋值的。 所以这一行:
testmap["asd"] = test(2); // error
无法编译,因为它需要一个用户定义的operator=
,而您还没有提供这个用户定义的operator=
。
相反,您可以这样做:
testmap.emplace("asd",test(2)); // ok
这是一个演示。