为什么传递具有 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