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