双重和并在C ++中移动函数

时间:2013-06-17 22:02:28

标签: c++ c++11 move

我想在C ++中使用参数来存储任何值/对象。 在此示例中,我尝试将全局变量中的值存储为简化示例。

此代码不起作用,

int value = 20;

void returnPointer2(int* hello)
{
    hello = &value;
}

// It changes nothing 
int value2 = 100; 
returnPointer2(&value2);
cout << value2 << endl;

因为我需要双指针。

void returnPointer3(int** hello)
{
    *hello = &value;
}

int* vp2 = new int();
*vp2 = -30;  
returnPointer3(&vp2);
cout << *vp2 << endl; // expects 20

我提醒了引用,我可以使用指针引用来获得相同的结果。

void returnPointer4(int* & hello)
{
    cout << "value : " << value;
    hello = &value;
}

int* vp3 = new int();
*vp3 = -130;  
returnPointer4(vp3); // also expects 20, but much simpler to use
cout << "better : " << *vp3 << endl;

我尝试使用double&amp;,然后编译。

void returnPointer5(int&& hello)
{
    cout << "value : " << value;
    hello = value;
}

但是,它不会使用整数变量的输入进行编译。

int vp4 = 123; 
returnPointer5(vp4); // also expects 20, but even more simpler to use
cout << "best : " << vp4 << endl;

这是一条错误消息。

pointer_return.cpp:31:6: error:   initializing argument 1 of 'void returnPointer5(int&&)'
void returnPointer5(int&& hello)

我碰巧知道move,它适用于此代码。

int vp4 = 123; 
returnPointer5(move(vp4)); // also expects 20, but much simpler to see
cout << "best : " << vp4 << endl;

这个move函数背后的神奇/逻辑是什么?

3 个答案:

答案 0 :(得分:2)

这里有很多东西混合在一起,但为了保持简单,我会解决你的根本问题。

&&完全不像**

&&rvalue reference,而**是指针的指针。


作为第二点,您要在函数名称中声明要执行的操作:returnPointer4

您希望指向返回的整数。 int*&是引用指针的正确语法。


再次阅读您的问题,为什么不使用以下内容:

int& returnGlobalReference() {
    return value;
}

然后在你的其他功能中:

int& value2 = returnGlobalReference();

答案 1 :(得分:1)

第一次尝试会犯一个经典错误,即按值传递指针,修改函数中的地址并期望它指向的地址发生变化。

如评论中所述,

void returnPointer2(int* hello)
{
    hello = &value; // don't do this, it only modifies what the 
                    // pointer hello, which resides in the stack, points to

    *hello = value; // do this instead. even though hello still resides in the                  
                    // stack, you're modifying the location that hello points to,
                    // which was your original intention

}

为什么要传递指针呢?是调用函数时不可用的静态变量? (也许,不同的文件?)

答案 2 :(得分:1)

std :: move的魔力是:

  

std :: move的实际声明有点涉及,但从本质上讲,它只是对rvalue引用的static_cast。

请参阅here

像杰弗里托马斯已经说过的那样,&amp;&amp;不是对引用的引用,而是对rvalue的引用。