std :: move如何使用带有非const引用的copy-constructor?

时间:2015-08-13 07:12:08

标签: c++ c++11 move-semantics rvalue-reference lvalue-to-rvalue

我正在阅读有关std :: move的内容。基于很少的材料,我得出结论,std :: move只是一个将其参数类型转换为rvalue-reference的函数。

我还读到,rvalue-references可以与将其参数作为const-references的函数一起使用。这是有意义的,因为保证对象的内容不会改变。

为了验证这些想法,我用下面的一个类做了一个非常简单的实验。

我创建了一个对象 t1 并使用 std :: move 将其转换为 rvalue-reference 并尝试创建另一个对象< strong> t2 ,调用copy-constructor。

神秘的部分是即使我不提供move-constructor,它也适用于copy-constructor,我将其参数定义为非const引用。

但是,如果std :: move将 t1 的类型转换为rvalue-reference,编译器如何将其绑定到左值引用?

顺便说一句,我使用的是“Microsoft(R)Microsoft Visual Studio 2012版本11.0.50727.1”。

请你解释一下我在这里缺少什么?

非常感谢。

#include <iostream>
#include <algorithm>

using namespace std;

class Trace {
    public:
        Trace() {
        }

        // @1
        Trace(Trace& t) {
            cout << "trace::trace(&)" << endl;
        }

        // @2
        Trace(Trace&& t) {
            cout << "trace::trace(&&)" << endl;
        }
};

int main(int argc, const char *argv[])
{
    Trace t1;

    // Calls @2 if it exists, otherwise calls @1 
    Trace t2(std::move(t1));
    return 0;
}

0 个答案:

没有答案