Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 左值的移动语义_C++_Std_Move Semantics_Rvalue - Fatal编程技术网

C++ 左值的移动语义

C++ 左值的移动语义,c++,std,move-semantics,rvalue,C++,Std,Move Semantics,Rvalue,为了更好地理解移动语义,我做了一个简单的测试。输出结果对我来说是意外的。下面是我的测试功能: template<class T> void test(T&& v) { v++; } void main() { int v = 1; test(std::move(v)); std::cout << "Output:" << v << std::endl; } 模板 无效测试(T&v) { v++;

为了更好地理解移动语义,我做了一个简单的测试。输出结果对我来说是意外的。下面是我的测试功能:

template<class T>
void test(T&& v)
{
    v++;
}

void main()
{
    int v = 1;
    test(std::move(v));
    std::cout << "Output:" << v << std::endl;
}
模板
无效测试(T&v)
{
v++;
}
void main()
{
int v=1;
测试(标准:移动(v));

std::cout
std::move
从不构造临时值。它是到右值引用的转换

此引用绑定到
main::v
,然后用它初始化
test::v
参数,因此也绑定到
main::v

如果要创建临时文件,请使用强制转换:

test(int{v});

std::move
从不构造临时值。它是到右值引用的转换

此引用绑定到
main::v
,然后用它初始化
test::v
参数,因此也绑定到
main::v

如果要创建临时文件,请使用强制转换:

test(int{v});

为了帮助您了解模板推导的类型,您可以使用宏
\uuuu PRETTY\u函数\uuuu

template<class T>
void test(T&& v)
{
    std::cout<< __PRETTY_FUNCTION__ << std::endl;
    v++;
}
模板
无效测试(T&v)
{

std::cout为了帮助您了解模板推导的类型,您可以使用宏
\uu PRETTY\u函数\uu

template<class T>
void test(T&& v)
{
    std::cout<< __PRETTY_FUNCTION__ << std::endl;
    v++;
}
模板
无效测试(T&v)
{

STD::Coumain main不符合C++标准。“代码> STD::移动< /COD>”的名字被严重地选择,这可能是什么使你困惑。它实际上不移动任何东西。它只是将一个LLVE值转换成一个RValk,使它可以运行一个MOVE。Valuemain不符合C++标准。n、 这可能就是让你困惑的地方。它实际上并没有移动任何东西。它只是将左值转换为右值,使移动成为可能。