为什么传递具有 const 引用成员的结构会导致 C2280 错误?
Why does passing a struct with const reference members cause a C2280 error?
我 运行 在尝试将具有 const&
成员的 struct
分配给地图时遇到了问题。
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 &)': attempting to reference a deleted function
任何人都可以向我解释这里的问题是什么吗?
这是一个最小的可重现示例。在我的实际项目中,数据要大得多,因此按值传递是不明智的。
引用不可分配。因此,编译器提供的默认 operator =
被隐式删除。即使你有
test& operator=(const test&) = default;
此处的“默认”operator =
是已删除的运算符,因此您仍然没有。您要么不需要使用参考,要么编写自己的 operator =
来满足您的需求。
由于您有引用成员,test
类型默认不可分配。所以这一行:
testmap["asd"] = test(2); // error
无法编译,因为它需要 user-defined operator=
,而您尚未提供。
相反,您可以这样做:
testmap.emplace("asd",test(2)); // ok
这里是 demo。
我 运行 在尝试将具有 const&
成员的 struct
分配给地图时遇到了问题。
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 &)': attempting to reference a deleted function
任何人都可以向我解释这里的问题是什么吗? 这是一个最小的可重现示例。在我的实际项目中,数据要大得多,因此按值传递是不明智的。
引用不可分配。因此,编译器提供的默认 operator =
被隐式删除。即使你有
test& operator=(const test&) = default;
此处的“默认”operator =
是已删除的运算符,因此您仍然没有。您要么不需要使用参考,要么编写自己的 operator =
来满足您的需求。
由于您有引用成员,test
类型默认不可分配。所以这一行:
testmap["asd"] = test(2); // error
无法编译,因为它需要 user-defined operator=
,而您尚未提供。
相反,您可以这样做:
testmap.emplace("asd",test(2)); // ok
这里是 demo。