Ссылка на значение в качестве параметра шаблона карты - PullRequest
1 голос
/ 14 апреля 2020

Я новичок в понятиях rvalue reference и std::move. Я попытался создать std::map, второй параметр шаблона которого является ссылкой на значение.

У меня есть этот DebugClass:

class DebugClass
{
public:
    int num;

    DebugClass() = delete;
    DebugClass(const DebugClass& rhs) = delete;
    DebugClass& operator=(const DebugClass& rhs) = delete;

    DebugClass(int num) : num(num)
    {
        printf("constructor\n");
    }

    DebugClass(DebugClass&& rhs)
    {
        printf("move constructor\n");
        this->num = rhs.num;
    }

    DebugClass& operator=(const DebugClass&& rhs)
    {
        printf("rvalue assignment\n");
        this->num = rhs.num;
    }
};

Вот как я его использую:

void foo(DebugClass&& dbgClass)
{
    std::map<uint32_t, DebugClass&&> myMap;
    myMap.insert(std::pair<uint32_t, DebugClass&&>(1, std::move(dbgClass)));
    printf("%d\n", myMap[1].num);
}


int main()
{
    foo(DebugClass(2));
}

Я хочу иметь возможность увидеть этот вывод:

constructor
move constructor
2

Но вместо этого я получаю ошибку компиляции:

Severity    Code    Description Project File    Line    Suppression State
Error   C2832   'std::pair<const _Kty,_Ty>::second': a reference type cannot be value-initialized   Tests   c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\tuple   1304    

Как мне переместить мои foo параметр в myMap?

...