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::coutstd::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、 这可能就是让你困惑的地方。它实际上并没有移动任何东西。它只是将左值转换为右值,使移动成为可能。