Почему передача структуры с константными ссылочными элементами вызывает ошибку C2280? - PullRequest
0 голосов
/ 04 августа 2020

У меня возникла проблема при попытке назначить карте struct с элементами const&.

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

Может ли кто-нибудь объяснить мне, в чем проблема? Это минимально воспроизводимый пример. В моем реальном проекте данных намного больше, поэтому было бы нецелесообразно передавать по значению.

Ответы [ 2 ]

5 голосов
/ 04 августа 2020

Ссылки не присваиваются. По этой причине значение по умолчанию operator =, предоставляемое компилятором, неявно удаляется. Несмотря на то, что у вас есть

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

, «по умолчанию» operator = здесь удаленный оператор, так что у вас его все еще нет. Вам либо нужно не использовать ссылку, либо написать свой operator =, который делает то, что вы хотите.

1 голос
/ 04 августа 2020

Поскольку у вас есть ссылочные элементы, тип test по умолчанию не назначается. Таким образом, эта строка:

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

не будет компилироваться, поскольку для нее требуется определенный пользователем operator=, который вы не предоставили.

Вместо этого вы можете сделать:

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

Вот демонстрация .

...