C++ 为什么传递带有常量引用成员的结构会导致C2280错误?
我在尝试使用C++ 为什么传递带有常量引用成员的结构会导致C2280错误?,c++,struct,reference,constants,C++,Struct,Reference,Constants,我在尝试使用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 testmap
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 testmap;
testmap[“asd”]=测试(2);
}
运行此代码会导致错误C2280'test&test::operator=(const test&'):试图引用已删除的函数
谁能给我解释一下这里的问题是什么?
这是一个最小的可重复性示例。在我的实际项目中,数据要大得多,因此按值传递是不明智的。引用是不可分配的。因此,编译器提供的默认运算符=
被隐式删除。即使你有
test& operator=(const test&) = default;
“default”操作符=
这里是一个已删除的操作符,因此您仍然没有。您可以不使用引用,也可以编写自己的操作符=
,以满足您的需要。由于您有引用成员,因此默认情况下,测试类型是不可分配的。所以这一行:
testmap["asd"] = test(2); // error
无法编译,因为它需要用户定义的运算符=
,而您尚未提供该运算符
相反,您可以:
testmap.emplace("asd",test(2)); // ok
这里有一个。为什么需要引用int
?@PaulMcKenzie这只是一个最小的可复制示例。在我的实际项目中,它比一个int
赋值操作符的默认实现要大得多,如果类包含引用,那么赋值操作符的默认实现是什么?嗯,test()
默认构造函数被删除。有趣的是,你的错误出现在它之前。提到如果代码真的工作了,它会产生无意义的东西,可能会有所帮助。此外,默认的ctor也被删除。
testmap.emplace("asd",test(2)); // ok