是否可以将对象移出函数? (C++11)

2024-03-24

该程序尝试将一个字符串移出函数并将其用于构造另一个字符串:

#include <iostream>
#include <string>
#include <utility>

std::string && Get_String(void);

int main(){

    std::string str{Get_String()};
    std::cout << str << std::endl;

    return 0;
}

std::string && Get_String(void){

    std::string str{"hello world"};

    return std::move(str);
}

程序可以编译,但执行时出现段错误。


这是我的理由:Get_String将创建一个本地字符串。在字符串超出范围之前,需要创建并返回该字符串的副本。该副本将用于构造 main 中的字符串。但是,如果我将字符串移出函数,则不需要进行复制。

为了尝试理解移动语义,有人可以解释为什么我正在做的事情可能没有意义。是否可以将对象移出函数?


EDIT:
如果我更改函数签名,它会正确编译并运行:

std::string && Get_String(void);

to

std::string Get_String(void);  

在这种情况下,在返回期间移动字符串是否会更有效?


鉴于这个例子,

X foo ()
{
  X x;    
  return x;
}

保证以下行为:

• If X有一个可访问的复制或移动构造函数,编译器可以 选择删除副本。这就是所谓的(命名的)返回值 优化 ((N)RVO),甚至在 C++11 之前就已指定,并且是 大多数编译器都支持。
• 否则,如果X有一个移动构造函数,x被感动了。
• 否则,如果X有一个复制构造函数,x被复制。
• 否则,将发出编译时错误。

另请注意,如果返回的对象是本地非静态对象,则返回右值引用是错误的:

X&& foo ()
{
  X x;
  return x; // ERROR: returns reference to nonexistent object
}

右值引用是一个引用,在引用本地对象时返回它意味着您 返回对不再存在的对象的引用。无论std::move()被使用 没有 事情。

std::move()并没有真正移动物体;它只会将左值转换为右值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以将对象移出函数? (C++11) 的相关文章

  • QCombobox 向下箭头图像

    如何更改Qcombobox向下箭头图像 现在我正在使用这个 QSS 代码 但这不起作用 我无法删除向下箭头边框 QComboBox border 0px QComboBox down arrow border 0px background
  • 为什么在创建矩阵类时使用向量不好?

    对于我的矩阵类 我做了 template
  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • ASP.NET Web API 客户端 ProgressMessageHandler Post 任务卡在 WinForm 应用程序中

    我在用着HttpClient and ProgressMessageHandler来自MS ASP NET Web API 客户端库 http nuget org packages Microsoft AspNet WebApi Clien
  • 类特定的新删除运算符是否必须声明为静态

    标准中是否要求类特定的 new new delete 和 delete 是静态的 我可以让它们成为非静态成员运算符吗 为什么需要它们是静态的 它们被隐式声明为静态 即使您没有键入 static
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 为什么 set_symmetry_difference 无法与比较器一起使用?

    Example program include
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • AES 输出是否小于输入?

    我想加密一个字符串并将其嵌入到 URL 中 因此我想确保加密的输出不大于输入 AES 是可行的方法吗 不可能创建任何始终会创建比输入更小的输出的算法 但可以将任何输出反转回输入 如果您允许 不大于输入 那么基本上您只是在谈论同构算法alwa
  • 无法在内存位置找到异常源:cudaError_enum

    我正在尝试确定 Microsoft C 异常的来源 test fft exe 中 0x770ab9bc 处的第一次机会异常 Microsoft C 异常 内存位置 0x016cf234 处的 cudaError enum 我的构建环境是 I
  • 将标量添加到特征矩阵(向量)

    我刚刚开始使用 Eigen 库 无法理解如何向所有矩阵成员添加标量值 假设我有一个矩阵 Eigen Matrix3Xf mtx Eigen Matrix3Xf Ones 3 4 mtx mtx 1 main cxx 104 13 error
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • 新任务中使用的依赖注入服务

    我在需要时使用依赖项注入来访问我的服务 但我现在想要创建一个并发任务 但这会由于依赖项注入对象及其生命周期而导致问题 我读过这篇文章 标题 防止多线程 Link http mehdi me ambient dbcontext in ef6
  • 将 char[][] 转换为 char** 会导致段错误吗?

    好吧 我的 C 有点生疏了 但我想我应该用 C 来做我的下一个 小 项目 这样我就可以对其进行抛光 并且我已经有不到 20 行的段错误了 这是我的完整代码 define ROWS 4 define COLS 4 char main map
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte

随机推荐

  • Scala 中难以理解的语法

    我在本文中找到了以下代码 http hseeberger wordpress com 2010 11 25 introduction to category theory in scala http hseeberger wordpress
  • 为什么我在 Python 中的负切片不起作用?

    我是 Python 新手 已经阅读了一些有关切片的教程 但是我在空闲状态下运行的示例似乎没有返回我期望的结果 例如 我已将以下列表分配给变量a a 0 1 2 3 4 5 6 7 8 9 现在我明白切片是 number I want to
  • 用于检测文件在不同运行之间是否发生更改的Python库?

    假设我有一个程序 A 我运行它 并从文件 foo txt 开始执行一些操作 现在A终止 新运行 A 它检查文件 foo txt 是否已更改 如果文件发生变化 A 再次运行其操作 否则退出 是否存在这样的库函数 外部库 当然可以用md5 包含
  • 如何使用marklogic数据库进行数据实时处理

    我正在尝试评估数据实时处理的标记逻辑 早些时候 我使用 kafka 和 Storm 来实时处理数据 并在处理后插入到数据库中 我是 marklogic 的新手 所以有人可以告诉我 marklogic 中是否有任何可用的东西 我可以使用它来实
  • 将提交推送到已打开拉取请求的另一个用户的分支

    我在 github 上有一个存储库 我的存储库是由另一个用户分叉的 现在他提出了拉取请求 我想将一个提交从我的一端推送到他的功能分支 他已为此提出了 PR 这可能吗 这是我所做的 git pull remote ref other user
  • Powershell 重命名和压缩

    需要使用powershell重命名同一目录中的所有文件 源文件 1234 56789abc t1 20201 0 4 0 pdf 1234 56788def t2 20200 0 4 1 pdf 重命名的文件 1000 56789abc t
  • “while (true)”通常用于永久线程吗?

    我对编码还比较陌生 我的大部分 工作 只是简单的 GUI 应用程序 只能完成一件事 所以我不需要太多线程 不管怎样 关于线程 我想知道的一件事是 如果你想让线程永远保持活动状态以完成它正在执行的任何工作 处理 等待输入等 那么将其格式化是否
  • 交换字符串中的字符

    我是 python 新手 我想知道如何交换字符串中的两个字符 我知道字符串是不可变的 所以我需要找到一种方法来创建一个交换字符的新字符串 具体来说 一般方法采用字符串和两个索引 i j 并将 i 上的字符与 j 交换 正如您正确指出的那样
  • 运行 Fish shell 时,“pandas”导入 (Mac OS X) 时出现“未知区域设置:UTF-8”错误 [重复]

    这个问题在这里已经有答案了 我最近升级到 Python 3 5 和最新版本的 pandaspandas 0 17 1 但这对我来说打破了包裹 我使用的是 Mac OS X 10 9 5 使用 Fish shell 我能做些什么 cls cl
  • 如何用c++编写可移植的浮点运算?

    假设您正在编写一个执行大量浮点运算的 C 应用程序 假设此应用程序需要在合理范围的硬件和操作系统平台上进行移植 例如 32 和 64 位硬件 32 和 64 位版本的 Windows 和 Linux 您如何确保您的浮点运算在所有平台上都相同
  • 如何在c#中打印方法的地址?

    在 C 语言编程中 void foo void main printf p foo 将打印 foo 函数的地址 请告诉我 C 中是否有方法可以实现相同的目的 C 是一种高级语言 方法不需要有 地址 这是留给运行时的实现细节 但是 如果您需要
  • 从不同文件创建 javascript 对象

    我已经尝试做 javascript 一段时间了 但我希望它是 面向对象的 所以我尝试在不同的文件中创建不同的 javascript 类 并尝试创建一个对象并在不同的文件中调用它的方法功能 但似乎不起作用 这是我到目前为止所拥有的 perso
  • 将列表转换为地图

    我得到了一个要转换为地图的字符串列表 我尝试了下面的方法 但我似乎不明白为什么它不起作用 List
  • 特定组件的自定义样式应用于 Angular 6 中的所有组件

    ui 网格 我试图将自定义样式应用于特定组件 我想更改该特定组件的字体大小 但是当我在该特定组件 css 文件中编写 css 代码时 并且在加载该组件后 该样式将应用到所有其他组件也 以下是css文件中的代码 k grid td font
  • 为什么新的 Mac 不显示我的屏幕保护程序?

    我们写了一个应用程序 屏保忍者 https screensaver ninja 通过将屏幕保护程序复制到 Library Screen Savers 来为用户安装屏幕保护程序 这在我的机器和其他开发人员的机器上运行良好 但在我拥有的测试机器
  • 如何在 SQL Server 中确定日期时间范围是否与另一个日期时间范围重叠

    我们有例如 下表 ID startDateTime endDateTime 1 2010 01 01 10 30 00 2010 01 01 11 00 00 2 2010 01 01 10 30 00 2010 01 01 11 30 0
  • C++ 计时,自上一整秒以来的毫秒数

    我正在开发一个需要详细计时信息 低至毫秒级别 的 C 应用程序 我们打算使用标准来收集时间到秒的精度time 函数于
  • 无效的捆绑包结构 - 该应用程序可能仅包含一个可执行文件。

    这个问题 https stackoverflow com questions 16424431 invalid bundle structure ios即使不相同 也是相似的 但没有解决方案 我查看了存档内部 发现只有一个可执行文件 所以我
  • javascript 如何上传 blob?

    我有一个这样结构的 blob 数据 Blob type audio wav size 655404 slice function size 655404 type audio wav proto Blob 它实际上是使用最新的 Chrome
  • 是否可以将对象移出函数? (C++11)

    该程序尝试将一个字符串移出函数并将其用于构造另一个字符串 include