复制省略可见副作用

2023-12-09

考虑这段代码:

#include <iostream>

using namespace std;

struct Foo {
public:
    int _a{};
    Foo(int a) : _a{a} 
    {
        std::cout << "ctor" << std::endl;
    }

    Foo(const Foo &)
    {
        std::cout << "copy" << std::endl;
    }
};

int main () {
    Foo a{10};
    Foo b = 10;
    std::cout << b._a << std::endl;
}

当我编译时

g++ -std=c++11 -fno-elide-constructors test.cpp

输出是

导演 导演 复制 0

这是我所期望的,因为Foo b = 10, 10隐式构造自int, then b是由以下内容构造的副本Foo。此外,我的复制构造函数不执行任何操作,因此该成员_a遗迹0(因为它是在类中初始化的)。

但是,当我使用复制省略时

g++ -std=c++11 test.cpp

输出是

导演 导演 10

这是奇怪至少可以说。我知道这里省略了复制构造函数,但这是一个严重的副作用(成员一次初始化为 0,一次初始化为 10),因为它会影响代码路径的其余部分。

这种行为正常吗?


在特定情况下将复制省略作为优化的全部目的是允许消除复制构造的副作用。也就是说,是的,尽管复制构造函数和/或析构函数有副作用,但它仍然期望复制省略发生。

如果您不希望在某些情况下发生复制省略,则需要安排禁止它。在您的具体情况下,不可否认,抑制复制省略有点烦人,但类似这样的方法应该可以解决问题:

template <typename T>
T const& inhibit(T const& ref) {
    return ref;
}
// ...
Foo b = inhibit<Foo>(10);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

复制省略可见副作用 的相关文章

随机推荐

  • 为什么 dataset.output_shapes 在批处理后返回尺寸(无)

    我正在 TensorFlow 中使用 Dataset API 作为输入管道 版本 r1 2 我构建了数据集 并以 128 的批量大小对其进行了批处理 数据集被输入 RNN 不幸的是 dataset output shape在第一个维度中返回
  • Phonegap/Javascript 应用程序:如何存储 cookie?

    我正在探索为平板电脑编写一个 javascript 应用程序的想法 该应用程序将阅读个性化新闻网站 我不拥有该网站 我想让用户登录 以便他们可以看到自己的内容 但我不知道如何使用 javascript 处理登录 cookie 即在每个请求时
  • 如何在 Cocoa 中创建别名?符号链接足够好吗?

    我找不到创建别名的便捷方法 所以我使用了符号链接 我担心这可能还不够好 也许该图标在某些版本的 OS X 或类似版本上不显示 NSFileManager defaultManager createSymbolicLinkAtPath ali
  • 有没有办法在应用程序被杀死时在 flutter 中接收数据通知?

    我正在尝试在 android 中实现推送通知的自定义 ui 标题 正文 从 url 加载的图像 firebase messaging dart 插件在应用程序被终止时接收数据通知有限制 使用数据负载而不是通知负载是在 Android 中原生
  • Chmod 777 到文件夹和所有内容[重复]

    这个问题在这里已经有答案了 我有一个网络目录 www以及该目录中的一个名为store Within store是几个文件和文件夹 我想给文件夹store以及其中的所有文件和文件夹store文件夹所有权限 我该怎么做呢 我猜是通过 htacc
  • 套接字绑定不会返回 int

    我的代码片段如下所示 int descriptor socket AF INET SOCK STREAM 0 if descriptor lt 0 cerr lt lt Error establishing socket connectio
  • 使用 javascript 数组填充 html 表

    我想用一个 HTML 表格来填充JavaScript array 但是 它不起作用 我不知道为什么 我的 innerHTML 没有被解释 我的变量包含良好的值 但是当我这样做时 document getElementById title i
  • Bootstrap 3 中的字形图标未在 Firefox 上呈现

    我将 Bootstrap 3 用于 Web 应用程序 我的计算机 Chrome IE 和 Firefox 一切正常 但我的一位客户看不到字形图标 I first thought the problem was my css but the
  • 转换时区 pandas 数据框

    我有数据 Symbol bid ask Timestamp 2014 01 01 21 55 34 378000 EUR USD 1 37622 1 37693 2014 01 01 21 55 40 410000 EUR USD 1 37
  • GET 的表达参数长度限制

    我有一个 Nodejs 应用程序 我在其中使用 Express 来实现 REST API 其中一个 API 接受 SQL 查询 在数据库上运行它并返回 JSON 响应 一切都工作正常 直到我使用长 SQL 查询测试 api 在调试时 我注意
  • 如何在 GWT 中公开类功能

    我有一个用 Java 编写的类库 想将其转换为 Javascript 所有方法都非常简单 并且主要与操作集合有关 我有一个类 GameControl 我可以实例化它 并且我希望将其方法暴露给页面上的其他 Javascript 代码 我想到使
  • SERVER_ERROR:[代码] 1675030 [消息]:执行查询时出错

    我在 Android 中使用 Facebook 登录 Code callbackManager CallbackManager Factory create LoginButton loginButton LoginButton this
  • Windows IoT - Zebra 蓝牙打印机

    我有两台 Zebra 蓝牙打印机 MZ220 和 iMZ220 我 唯一 要做的事情就是在 Raspberry Pi 2 上使用 Windows IoT 系统打印文本 仅此而已 例子 1号线 Hello World Line2 Line3
  • NetBeans:JasperReport 异常

    我正在开发一个需要Jasper报告的项目 我使用下面提到的代码片段在NetBeans 6 1中查看报告 该报告最初是使用iReport 3 6 0生成和编译的 我的要求是使用打印此报告一个简单的 Swing 应用程序 代码片段 public
  • 在 android 中,在 recyclerView 中准确显示按钮所在位置的弹出窗口

    I m working on a gridLayout with recyclerView in android I ve a an option with each grid Item where I want to show my po
  • iOS 在另一个项目中使用现有项目的类/资源文件

    我在 App Store 中有一个 iPhone 应用程序的现有 xCode 项目 该项目包含许多视图控制器 视图 XIB 文件 图像 等 我希望创建另一个项目 其行为方式完全相同 包含相同的控制器 视图 图像 等 除了我希望更改一些小东西
  • 如果 JSF 不支持,为什么我能够将 绑定到任意方法?

    我正在使用 Glassfish 3 1 2 2 和 JSF Mojarra 2 1 6 我有以下 Facelets 页面
  • 为什么消息打印两次?

    我正在为 C 创建一个简单的 Tic Tac Toe 这是一个我遇到问题的特定函数 这应该让用户选择 X 或 O 并且对于大多数艺术来说它都有效 但是 如果我输入错误的符号 它会打印以下语句 无效符号 请重新输入 两次 Why and ho
  • 如何从网页上使用关联程序打开本地文件?

    我知道我的应用程序的用户有一个名为 c sourcefile cs 的本地文件 我需要找到一种方法来呈现该文件的链接 以便当他单击该链接时 它将在 Visual Studio 中打开该文件 这是供我们开发团队内部使用的 因此如果没有标准方法
  • 复制省略可见副作用

    考虑这段代码 include