为什么持有引用的类可以复制?

2024-05-06

如果有一个类持有引用,我希望以下代码会惨败,但它可以编译:

#include <iostream>

struct ReferenceHolder
{
    std::string& str;

    ReferenceHolder(std::string& str)
    :   str(str)
    {}
};

// Why does this compile?
ReferenceHolder f() {
    std::string str = "Hello";
    return ReferenceHolder(str);
}

int main() {
    ReferenceHolder h  = f();
    std::cout << "Should be garbage: " << h.str << '\n';
    return  0;
}

编译器:g++ 4.7.2(带有-std=c++11)

Edit:即使使用 -fno-elide-constructors 它也能愉快地编译


正如您的示例所示,复制初始化您的类没有问题:新引用只是初始化为引用与旧引用相同的对象。当然,当函数返回使引用悬空时,您会得到未定义的行为。

该引用可防止默认初始化和复制分配;因此,由于这些原因,以下小更改将失败:

ReferenceHolder h;  // ERROR: can't default-initialise the reference
h = f();            // ERROR: can't reassign the reference.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么持有引用的类可以复制? 的相关文章

随机推荐

  • 如何在 Intellij IDEA 中构建和运行 Storm Topology

    我按照 Storm Starter 说明并在 IntelliJ 中导入了 Twitter Storm 为了测试 我编辑了感叹拓扑一点并使用以下 Maven 命令来构建并运行它 mvn f m2 pom xml compile exec ja
  • 可运行的 JAR 无法与引用的库一起使用

    我想创建一个可运行的 JAR 其中包含引用的库 即jackson http jackson codehaus org 在 Eclipse 中通过导出 过去有fat jar这似乎是 Eclipse 提供导出到可运行 JAR 之前的 goto
  • foo.Name undefined(类型接口{}没有字段或方法名称)

    我使用本机 golang 包 container list 来管理堆栈中的 inotify 事件 当我访问堆栈的项目时 我的类型失败 我认为 import golang org x exp inotify container list lo
  • C# 接口实现关系只是“Can-Do”关系?

    今天有人告诉我 C 中的接口实现只是 Can Do 关系 而不是 Is A 关系 这与我长期以来所相信的LSP 里氏替换原理 相冲突 我一直认为所有的继承都应该意味着 Is A 关系 所以 如果接口实现只是一种 Can Do 关系 如果有一
  • UICollectionView 单元格旋转后不水平

    我有一个 UICollectionView 带有一个用于创建单元格的按钮 该单元格应按创建顺序显示 在空间允许的情况下 横向和纵向 1 2 3 4 文本视图受到灵活宽度的限制以填充单元格 单元格的大小取决于设备和旋转 每行允许 1 2 3
  • 是否可以仅在一张表上运行“symfonydoctrine build --all”任务?

    如果我运行以下任务 它会构建所有内容并清除数据库 php symfony doctrine build all 我希望此任务仅针对我放入 schema yml 的新表运行 是否可以 我认为你应该为此使用迁移 首先 您需要恢复初始状态 当模式
  • 实时搜索错误

    我正在获取用户偏好和角色 一切正常并且数据接收正确 默认值放置在单选按钮上以突出显示用户当前拥有的选项 我正在使用 Antd Design Table 组件 问题 当我将用户首选项更改为打印文档时 它确实通过数据库的状态成功更改了它 但是现
  • “该网站似乎使用了滚动链接定位效果。这可能不适用于异步平移”

    我从 Firefox 收到了这个不寻常的警告 它所指的定位效果是div我将旋转作为滚动高度的一个因素 我从来没有遇到过任何问题 但是这是我应该担心的事情吗 如果没有这个警告 是否有这样的效果 演示此问题的 JavaScript 是 gear
  • 有没有一种有效的方法来优化我的序列化代码?

    这个问题缺乏细节 因此 我决定创建另一个问题而不是编辑这个问题 新问题在这里 我可以并行化我的代码吗 还是不值得 https stackoverflow com questions 17937438 can i parallelize my
  • 将左按钮添加到 UINavigationBar (iPhone)

    我创建了一个新的基于导航的 iPhone 应用程序 我将其添加到 RootViewController 中 void viewDidLoad super viewDidLoad UIBarButtonItem addButton UIBar
  • Qt 远程文件浏览器

    我想知道是否有人使用过 Qt 远程文件浏览器 根据我的理解 我有两个选择 当涉及到远程文件时 将 QFileDilaog 与自定义代理模型结合使用 该模型将负责提供远程文件 目录结构 使用自定义对话框 并为本地文件提供标准文件系统模型 为远
  • Windows Phone 7 中的 ASCII 编码

    有没有办法在 Windows Phone 7 中使用 ASCIIEncoding 除非我做错了什么Encoding ASCII不存在 我需要它来进行 C gt PHP 加密 因为 PHP 在 SHA1 加密中仅使用 ASCII 有什么建议么
  • 如何使用 Qt Test 控制 QFileDialog?

    我有两个问题 我怎样才能访问QFileDialog并使用 Qt Test 模块在 文件名 字段中写入文件的路径 我这么问是因为我正在 Qt 中开发一些 GUI 测试 现在我需要打开一个文本文件 以下代码创建QFileDialog并获取文件路
  • 以编程方式清除 Silverlight 应用程序存储?

    我为一些客户发布了 Silverlight 应用程序 我在发布更新时遇到问题 我希望当用户最初加载网页时 如果他们的应用程序存储比上次更新网站时旧 那么this http www softcity com article internet
  • Outlook Interop C# 排序项目不起作用

    我偶然发现了一个问题 即 Outlook 项目表排序方法没有给出所需的结果 尽管方法 GetLast 始终返回相同的电子邮件项目 无论是升序还是降序 代码如下 Application olApp new Application NameSp
  • 如何从JSP中获取java类的对象

    我有一个结果jsp页面 它打印java类的字符串变量 有人能给我任何想法吗 我使用简单的 httpServlet 作为操作类 Class A String name public void setName this name callMet
  • 如何在机器人框架中使用“Run Keyword If”

    我刚刚开始研究机器人框架 我正在尝试使用Try Keyword If关键字 但我在网上看到的所有示例都在一行中显示了解决方案 而我在 RIDE 中有列和行 如果当前页面上有一个 ID 为 当前状态 的按钮 那么我想访问 URL www xy
  • React Router V5 在路由中使用上下文变量的最佳方式

    在我的应用程序中 我定义了路线 如下所示
  • lxml etree xmlparser 删除不需要的命名空间

    我有一个 xml 文档 我正在尝试使用 Etree lxml 解析它
  • 为什么持有引用的类可以复制?

    如果有一个类持有引用 我希望以下代码会惨败 但它可以编译 include