0

我正在阅读有关 std::move 的信息。根据很少的材料,我得出结论 std::move 只是一个将其参数类型转换为右值引用的函数。

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

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

我创建了一个对象t1并使用std::move将其转换为右值引用,并尝试通过调用复制构造函数创建另一个对象t2 。

神秘的部分是,即使我不提供移动构造函数,它也可以与我故意将其参数定义为非常量引用的复制构造函数一起使用。

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

顺便说一句,我正在使用“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;
}
4

0 回答 0