提问者:小点点

为什么传递具有常量引用成员的struct会导致C2280错误?


我在尝试将具有常量的结构成员分配给映射时遇到了一个问题。

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&)':尝试引用已删除的函数

有谁能向我解释一下这里的问题是什么? 这是一个最小的可复制的例子。 在我的实际项目中,数据要大得多,因此按值传递是不明智的。


共2个答案

匿名用户

引用不可赋值。 因此,编译器提供的默认运算符=被隐式删除。 即使你有

test& operator=(const test&) = default;

这里的“default”operator=是一个已删除的运算符,因此您仍然没有运算符。 您要么不需要使用引用,要么编写自己的运算符=来执行您想要的操作。

匿名用户

由于您有引用成员,test类型默认情况下是不可赋值的。 所以这一行:

testmap["asd"] = test(2);  // error

无法编译,因为它需要一个用户定义的operator=,而您还没有提供这个用户定义的operator=

相反,您可以这样做:

testmap.emplace("asd",test(2));  // ok

这是一个演示。