什么时候返回右值引用会导致未定义的行为?

2024-03-27

在 Stack Overflow 的回答中here https://stackoverflow.com/a/9964002/1128289,Kerrek 发布了以下代码。

Foo && g()
{
    Foo y;
    // return y;         // error: cannot bind ‘Foo’ lvalue to ‘Foo&&’
    return std::move(y); // OK type-wise (but undefined behaviour, thanks @GMNG)
}

GManNickG 指出这会导致未定义的行为。

克雷克补充道

真的;除了前进和移动之外,您实际上并没有从任何地方返回&&。 这是一个人为的例子。

让我困惑的是,C++11 标准使用返回右值引用的函数调用作为 xvalue 表达式的示例。

xvalue(“eXpiring”值)也指一个对象,通常靠近 其生命周期结束(以便其资源可以被移动,例如 例子)。 xvalue 是某些类型表达式的结果 涉及右值引用 (8.3.2)。 [ 示例:调用结果 返回类型为右值引用的函数是 xvalue。 -结尾 例子 ]

那么,返回右值引用到底什么时候会导致未定义的行为呢?它是否总是导致未定义的行为,除了std::move and std::forward标准只是简单吗?或者您是否必须访问返回值才能产生未定义的行为?

*“何时”是指“在什么情况下”。我意识到这里没有有意义的时间概念。


转换为引用不会延长局部变量的生命周期。

因此,在本地过期后使用对本地的引用是未定义的行为。

由于函数完成时本地过期,因此无法使用返回值。

std::move or std::forward接受一个引用,并返回一个可能不同类型的引用。既不延长争论的生命周期,也不返回对自己身体局部变量的引用。

这里的 UB 不返回右值引用,而是基于对象生命周期。它发生在使用时,而不是在施放或返回时。

也就是说,返回右值引用几乎从来都不是一个好主意:而是返回一个副本。副本可以参与寿命延长。例外是当你写类似的东西时forward_as_tuple.

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

什么时候返回右值引用会导致未定义的行为? 的相关文章

  • 我的 std::hash for std::tuples...有什么改进吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有些人可能已经注意到 std hash 不支持元组 所以我添加了一个重载 它看起来比我到目前为止看到的解决方案 更好 有人有进一步减少这段代码的
  • 如何在 ASP.NET MVC 中将 XML 文件发送到客户端

    在 ASP NET MVC 中 我有一个数据库表 我想在某个视图页面上有一个按钮 如果某个用户单击该按钮 我的应用程序将生成包含数据库中所有行的 XML 文件 然后 应将包含 XML 的文件发送到客户端 以便用户看到下载弹出窗口 同样 我希
  • 采用 std::vector 或 std::array 的模板函数

    我有一个函数 当前接受 2 个向量 其中可以包含任何普通的旧数据 template
  • getline 之后返回到文件开头

    所以我已经从文件中读取了所有行 while getline ifile line logic 其中 ifile 是 ifstream line 是字符串 我的问题是我现在想再次使用 getline 并且似乎无法返回到文件的开头 因为运行 c
  • 在 WCF 上重用我的 PagedList 对象

    问题 我有一个自定义集合PagedList
  • 更新 Azure Blob 上的 LastModified

    我正在移植代码以使用 C 中的 Azure 存储 SDK 传统上 我称其为更新修改文件的上次写入 修改时间 File SetLastWriteTimeUtc fileName lastWriteTimeUtc 要更新 blob 的上次修改时
  • Boost MPI 在监听列表时不会释放资源?

    这是一个后续问题如何释放 boost mpi request https stackoverflow com questions 44078901 how do i free a boostmpirequest 我在监听列表而不是单个项目时
  • 头文件中实现的函数的静态与内联

    我想到的方式inline在 C 中用于链接 作用域 我把它放在同一个篮子里extern and static对于全局对象 通常 对于在头文件中实现的函数 我的首选解决方案是将其设为静态 In Foo h static void foo Do
  • C# 中类似图的实现

    所以我有一个对象 我们称之为 Head 它有一个对象列表 C C1 C2 C3 T T1 T2 和 M M1 M2 并且所有这些都是相互关联的 例如 Head gt C1 C2 C3 T1 T2 M1 M2 T1 gt C1 C2 T2 g
  • C++ 指针和对象实例化

    这有效 MyObject o o new MyObject 而这并不 MyObject o new MyObject Why 关键词new 返回一个指针 http msdn microsoft com en us library kewsb
  • 预编译头和 Visual Studio

    有没有办法设置 Visual Studio 解决方案参数 以便它只创建预编译头而不构建整个解决方案 具体来说 它是一个巨大的 C 解决方案 本身有许多项目 谢谢 仅选择 pch 创建者源文件 通常是 stdafx cpp 然后编译该文件 C
  • 无法将参数从 `const char *` 转换为 `char *`

    鉴于此代码 void group build int size std string ips Build the LL after receiving the member list from bootstrap head new memb
  • asp.net core http 如果没有内容类型标头,则删除 `FromBody` 忽略

    我在 http 中使用 bodyDELETE要求 我知道目前删除主体是非标准的 但是允许的 使用时出现问题HttpClient它不允许删除请求的正文 我知道我可以使用SendAsync 但我宁愿让我的 API 更加灵活 我希望这个机构是可选
  • 使用 OleDbCommand / OleDbDataAdapter 读取 CSV 文件

    我不明白为什么 但是当我使用 OleDbDataAdapter 或 OleDbCommand 读取 CSV 文件时 在这两种情况下 生成的数据结构良好 它识别文件头中的列 但行数据都是空字符串 我之前已经成功进行过多次 CSV 处理 因此我
  • 冒号在c中起什么作用?

    我在课堂上得到了这个例子 但我不确定它的作用 我知道冒号添加了一个位字段 但我仍然不确定这个问题 a b gt 0 3 1 运算符称为条件运算符 If b值为 gt 0 价值3被分配给a否则值1被分配给a 以 Kernighan Ritch
  • 如何禁用基于 ValidationRule 类的按钮?

    如何禁用基于 ValidationRule 类的 WPF 按钮 下面的代码可以很好地突出显示 TextBox
  • 从具有相同属性的另一个对象创建对象

    我有一个 C 对象 可以说有 20 个属性 它是数据契约的一部分 我还有另一个具有类似属性的业务实体 我想从响应对象中填充该实体 除了将一个对象的每个属性分配给另一个对象的相应属性之外 还有其他方法可以做到这一点吗 是的 看看自动映射器 h
  • 使用任务的经典永无止境的线程循环?

    给出了一个非常常见的线程场景 宣言 private Thread thread private bool isRunning false Start thread new Thread gt NeverEndingProc thread S
  • 创建进程默认浏览器

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 我想获取线程 id 因此 ShellExecute 无法获取线程 id 因此我开始使用
  • 如何根据当前日期时间发现财政年度?

    我需要基于当前或今天的日期时间的财政年度 假设我们认为今天的日期是10 April 2011 那么我需要输出为Financial Year 2012在某些情况下 我需要以短格式显示相同的输出FY12 我想以两种方式显示 在我们的要求中 考虑

随机推荐

  • MySQL SUM 函数

    我了解 SQL sum 函数 这是我的代码
  • 无法对文档执行 querySelectorAll。怎么修?

    我在做什么 我有从 PHP 数组生成的链接 该数组生成它自己的唯一 ID 该 ID 应该指向它自己的模态 弹出窗口 div 该 div 具有与链接 ID 匹配的 ID 模态框也是使用 PHP 数组自动生成的 我收到这个错误 我对此非常陌生
  • REPLACE INTO 查询是好的做法吗?

    我需要一个 SQL 查询来更新或创建数据库条目 如果某个客户尚不存在 我在网上找到了目前的解决方案 command CommandText REPLACE INTO Resource Tracer dbo Customer Customer
  • 如何登录 OpenEdge Progress?

    我找到了在 Progress 4GL 中记录某些内容的不同方法 但没有一个令人满意 简单的MESSAGE语句的缺点是它对帧的处理非常糟糕 ON CHOOSE OF btn Q4 DO MESSAGE Line 1 MESSAGE Line
  • struts2 中的 JQuery Grid - 初学者

    我对 struts2 和 JQuery 编程很陌生 在我的应用程序中 当调用 loginAction 时 如果用户是管理员 我会将他们定向到 AdminLoadAction 此操作加载 adminHome jsp 我需要的是 adminHo
  • 有没有办法将--compressed传递到PHP的curl_setopt()中?

    使用curl时 我发现我所访问的服务器上的行为有所不同 具体取决于我是否通过 compressed作为一个论点或不 我已经将 Accept Encoding 标头设置为 gzip deflate sdch curl setopt ch CU
  • 使用 NSPredicate 搜索 NSFetchedResultsController

    我已经被这个问题困扰了一段时间 并已尽力找出解决方案 我正在使用 Core Data 而且对于 iOS 编码来说相对较新 我在如何搜索 fetchedResultsController 以过滤掉用户在 searchBar 中输入的字符串时遇
  • kubernetes 中的 PreStop 钩子永远不会被执行

    我正在尝试创建一个小 Pod 示例 其中包含两个通过 emptyDir 卷共享数据的容器 在第一个容器中 我等待了几秒钟 然后它就被销毁了 在 postStart 中 我正在将一个名为 started 的文件写入共享卷 在 preStop
  • 即使有请求,为什么 gcc 也不抱怨数组边界?

    我正在使用 gcc 4 9 0 我希望看到编译器警告我超出数组范围 如果我编译这个 int main int table 5 0 table 8 1234 int x table 10 使用 g O2 Wall main cpp o mai
  • 如何使用 jQuery 将行追加到表中?

    您好 我尝试使用 jQuery 在表中添加一行 但它不起作用 可能是什么原因 而且 我可以为新添加的行添加一些值吗 这是代码
  • 地理数据网络服务

    我正在考虑编写一个程序来检查英国议会议员最近提出的一些里程声明 实际上大约有 45 000 个里程 我所掌握的数据相当准确 旅行的出发地和目的地通常仅 在城镇级别提供 我想做的基本上是查看他们提交的里程数据 查看从网络服务获得的 计算 里程
  • 当 Node.js 内部仍然依赖于线程时,它如何本质上更快?

    我刚刚观看了以下视频 Node js 简介 http www yuiblog com blog 2010 05 20 video dahl 并且仍然不明白如何获得速度优势 主要是 Ryan Dahl Node js 的创建者 曾经说过 No
  • Android Ion 缓存刷新

    我使用特定的网址在线获取图像 但网址本身每隔几分钟就会自动更改 我正在使用 ION 库Here https github com koush ion我遇到的问题是 当我刷新页面时 页面本身看起来正在刷新 但出现了完全相同的图片 我假设它是缓
  • 使用 Silverlight 的本地数据库

    对于 Silverlight 应用程序来说 什么是好的本地数据库 数据库的主要用途是提供本地数据缓存和同步服务 我不相信 SQL Anywhere 或 SQLite 会工作 因为它们使用非托管代码 无法在 silverlight 沙箱下运行
  • 如何对 Android 应用程序进行定时炸弹?

    大家好 有没有人有一个代码示例 说明如何对 Android 应用程序进行定时炸弹 使其在给定日期后无法运行 我想发布一个 测试版 应用程序进行测试 但希望确保它仅在该应用程序正式处于测试版时才能工作 我建议使用 Calendar 类并让您的
  • Android:从软键盘中删除 Enter 键

    在我的登录表单中 当用户单击 EditText 并按 Enter 键时 会插入一个新行 从而增加 EditText 的大小 下一刻 它返回到之前的位置 并在密码字段 这是下一个字段 中打印一个点 我想从软键盘上删除这个回车键 是否可以 Us
  • Android java.lang.ClassCastException:android.widget.LinearLayout 无法转换为 android.widget.TextView

    我试图打印在 listView 中单击的值 但随后出现以下异常 07 04 10 40 56 482 E AndroidRuntime 1356 FATAL EXCEPTION main 07 04 10 40 56 482 E Andro
  • Reactjs 状态未更新

    constructor props super props this state active false showSideBar false className componentDidMount if this props overla
  • 创建包含所有可能变体的产品数组

    我正在尝试生成一个包含产品所有变体的数组 可以有无限数量的属性和变化 提供的数组 Shirt Product Color Attribute Green Variation Red Blue Size Small Medium Large
  • 什么时候返回右值引用会导致未定义的行为?

    在 Stack Overflow 的回答中here https stackoverflow com a 9964002 1128289 Kerrek 发布了以下代码 Foo g Foo y return y error cannot bin