当前位置: 首页 > 知识库问答 >
问题:

std::move(std::string)不使传递的参数变为空状态

汤修贤
2023-03-14

我有点不明白为什么std::move(std::string)不使传递的std::string参数变为空状态(我的意思是std::string大小为0,并且在调用std::move(std::string)之后,其内部缓冲区指向nullptr)。这是一个示例代码

#include <iostream>
#include <string>

void print(std::string& str) {
    std::cout << "lref\n";
    std::cout << str << "\n" << std::endl;
}

void print(const std::string& str) {
    std::cout << "const lref\n";
    std::cout << str << "\n" << std::endl;
}

void print(std::string&& str) {
    std::cout << "rref\n";
    std::cout << str << "\n" << std::endl;
}

int main() {
    std::string str_a = "Hello, ";
    std::string str_b = "world!";
    
    print(str_a);
    print(str_b);
    print(str_a + str_b);
    
    print(std::move(str_a));
    print(str_a); // was expecting str_a to be empty but still prints Hello, 
    
    return 0;
}

共有1个答案

东方飞捷
2023-03-14

std::move不移动任何内容。要进行实际移动,需要将str作为rvalue-reference传递给另一个字符串的移动构造函数,如下所示。

std::string new_str(std::move(str));
print(str_a);
 类似资料:
  • 在我的Fedora 34环境(g)中,定义为: 如果表达式已经是右值,那么

  • 代码如下: 我假设错误发生在insert函数中,并且与参数初始化有关。 bintree.cpp:65:27:错误:使用删除的函数'std::unique_ptr<_tp,_dp>::unique_ptr(const std::unique_ptr<_tp,_dp>&)[with_tp=bintreenode;_dp=std::default_delete>]“tree.insert(tree.ro

  • 问题内容: 我正在使用SWIG从Java访问C ++代码。 公开非常量引用传递的std :: string参数的最简单方法是什么? 我有参考暴露为Java数组传递原语,感谢typemaps.i,和s ^暴露,感谢std_string.i。但是非const std :: string&被公开为不透明指针类型。 当前: 期望的: 更新 :我找到 了 解决方案,如下所述。但是,它花费了超过几秒钟的时间。

  • 我想通过包装C 11中的std::thread类来使用我自己的Thread实现,这样我就可以像我想要的那样处理异常。 这是我的包装类: 如果没有争论,它的效果相当不错: …但如果我尝试传递可变参数: ...我在编译时收到一个错误: buildroot-2014.02/output/host/usr/i586-buildroot-linux-uclibc/include/c /4.8.2/funct

  • 我有下面的函数声明: 我有另一个函数,我想添加一个< code>std::function作为参数: 然而,我不知道该如何称呼它,或者说我上面的定义是否正确: 编译器错误: 有什么想法吗?

  • 首先通过了解它们(指std::move和std::forward)不做什么来认识std::move和std::forward是非常有用的。std::move不move任何东西。std::forward也不转发任何东西。在运行时,他们什么都不做。不产生可执行代码,一个比特/Users/shikunfeng/Documents/neteaseWork/timeline_15_05_18/src/mai

  • 代码如下(为简洁起见摘录): 颜色h: 颜色cpp: 我得到以下错误: 颜色cpp:16:29:错误:传递“const std::map” 错误指的是“返回颜色[cColortype];”在getColorText中。 我写这篇文章是为了一个类项目,我可以通过删除getColorText签名中的const声明来让它工作,但我正在尝试学习/采用良好的实践,并遵循建议,在不修改数据的成员函数中使用co

  • 我有以下课程 我在下面的代码中使用 由此产生的行为对我来说是可以理解的。在第一次调用中,构造一个小部件,然后调用移动构造函数,并在临时小部件上调用析构函数。 第二个调用也执行相同的操作,除了调用move赋值运算符而不是move构造函数。离开main方法,析构函数在<code>c<code>上调用。 现在是有趣的部分: 如果我省略了对< code>std::move的调用,第一种情况会停止工作,只导