C++:为什么这个简单的 Scope Guard 有效?

2023-11-27

到目前为止,每个查看的作用域防护都有一个防护布尔变量。例如,请参阅此讨论:最简单、最简洁的c++11 ScopeGuard

但一个简单的守卫可以工作(gcc 4.9,clang 3.6.0):

template <class C>
struct finally_t : public C {
    finally_t(C&& c): C(c) {}
    ~finally_t() { (*this)(); }
};
template <class C>
static finally_t<C> finally_create(C&& c) {
    return std::forward<C>(c);
}
#define FINCAT_(a, b) a ## b
#define FINCAT(a, b) FINCAT_(a, b)
#define FINALLY(...) auto FINCAT(FINALY_, __LINE__) = \
    finally_create([=](){ __VA_ARGS__ })

int main() {
    int a = 1;
    FINALLY( std::cout << "hello" << a << std::endl ; );
    FINALLY( std::cout << "world" << a << std::endl ; );
    return 0;
}

为什么没有销毁临时副本?依赖这种行为有危险吗?


您正在观察复制消除(或在本例中为移动消除)的效果。复制消除不是保证/强制的,但通常由主要编译器执行,即使在没有优化的编译时也是如此。尝试 gcc 的 -fno-elide-constructors 来查看它“中断”:http://melpon.org/wandbox/permlink/B73EuYYKGYFMnJtR

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

C++:为什么这个简单的 Scope Guard 有效? 的相关文章

  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string

随机推荐

  • C# ASP.NetParameters.AddWithValue 拒绝参数的空值

    我正在使用存储过程填充表 该表允许名称的中间首字母为 null 但我收到以下错误消息 过程或函数 uspInsertPersonalAccountApplication 需要参数 MiddleInitial 但未提供该参数 提前致谢 pub
  • 检查 UIScrollView 是否到达顶部或底部

    有没有办法知道是否UIScrollView已经到达顶部还是底部 可能在方法中 void scrollViewDidEndDragging UIScrollView scrollView willDecelerate BOOL deceler
  • R - 使用 x 和 y 数据绘制幂律线

    我正在尝试绘制幂律线来拟合数据框中已有的 x 和 y 数据 我已经在 igraph 库中尝试过 power law fit 但它不起作用 数据框是 dat data frame x 1 8 ygm c 251 288 167 739 112
  • 检测ajax调用,ASP.net

    如何在 ASP net 应用程序的服务器端检测请求是否是 AJAX 请求 来自 jQuery 我不想这样做 mypage aspx this is ajax true ex get mypage aspx 在服务器端 当请求是 ajax 请
  • 在 PHP 中使用 ' 代替撇号(')

    我尝试将文本转换为 utf8 或从 utf8 转换 但这似乎没有帮助 我越来越 It s Getting the Best of Me 它应该是 It s Getting the Best of Me 我从以下位置获取这些数据这个网址 要转
  • 在新的 matlab 版本上运行旧的 mex 文件

    我正在尝试在新版本 R2009a 上运行最初在 Matlab 6 5 上测试的程序 该程序使用一些 mex 文件 在尝试运行它时出现以下错误 无效的 MEX 文件 normalizedCut common files sparsifyc m
  • Android:导航到父活动重新创建父活动

    我有一个 SearchActivity 它有一个子 PersonActivity 每个都是 FragmentActivity 的 这是我的清单文件
  • Android 3.2 从操作栏中删除标题

    我正在使用 eclipse android 3 2 以及运行 android x86 的虚拟机 v3 2 我使用 Holo 主题 我想删除操作栏标题和图标 所以我这样做 Override public void onCreate Bundl
  • Facebook 在首次分享时忽略了 OG 图片

    我正在开发一个 WordPress 网站 并使用 yoast seo 插件在动态页面上生成 og 图像 不过 我认为这与此无关 og 图像链接显示完美 但如果我单击共享按钮 则不会包含任何图像 除非我之前已经单击过共享按钮 或者首先使用 f
  • Rails 中的资产/图像没有路由匹配

    在导轨上工作时 图像不可见并给出错误 Started GET assets home png for 127 0 0 1 at 2012 06 19 12 23 24 0530 Served asset home png 404 Not F
  • ASAN 检测到与动态加载库共享的类 vtable 的 ODR 违规

    我正在开发一个项目 它有一个 util 库 其中包含日志记录 断言处理等内容 它被编译成静态库 fPIC添加 我还有一个插件系统 其中插件是在运行时加载的共享库dlopen 这些插件和主要可执行文件都使用静态 util 库 问题 现在我得到
  • “无法找到模块‘jquery’” - 使用 Gulp 在 browserify 中处理 JQuery 和 AngularJS 的全局变量

    我一直在尝试创建一个利用AngularJS Browserify and Gulp以获得出色的开发人员体验 即生成可分发的 模块 用 Angular 的说法 这个想法是有一个自我记录的项目 比如Angular Bootstrap 这还会生成
  • 传递一个函数作为参数,然后在jquery函数中执行它

    我想知道用 jQuery 实现这个简单 也许是愚蠢 的事情的方法是什么 我有一个这样的函数 function setSomething make some stuff 然后是另一个像这样的函数 generalFunction par1 pa
  • TFS Sprint 项目打印插件 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有谁知道 TFS 是否有一个插件 可以以适合在 Scrum Board 上使用的格式打印我们的 sprint backlog 项目 而不是我们必须手
  • 获取相机当前图片文件夹

    我的应用程序中有一个小型 FileExplorer 我希望他在当前由默认相机使用的文件夹中启动 有办法得到这条路吗 我尝试过 Environment getExternalStoragePublicDirectory Environment
  • Delphi 2010 中返回泛型接口的泛型方法

    鉴于下面的代码是实际代码的一个非常精简的版本 我收到以下错误 DCC 错误 Unit3 pas 31 E2010 不兼容的类型 IXList FindAll S gt 和 TXList FindAll S gt 在 FindAll 函数中
  • 以编程方式获取布局的高度和宽度

    我设计了一个布局 其中LinearLayout有 2 个孩子LinearLayout and FrameLayout我对每个孩子都提出了不同的看法 我只是想测量高度和宽度FrameLayout这样我就可以达到我的目的 在程序中我正在使用 i
  • MFC 功能包类菜单上的图标

    新的 MFC 功能 功能包 中菜单出现在三个位置 在菜单栏中 MFC MenuBar 在弹出菜单中 CMFCPopupMenu 在 CMFCButton 的 下拉菜单 版本中 我想将图标 高颜色且透明 放在所有菜单中 我找到了 CFrame
  • 如何在 PowerShell 中处置 System.Xml.XmlWriter

    我正在尝试处置 XmlWriter 对象 try System Xml XmlWriter writer System Xml XmlWriter Create c some xml finally writer Dispose Error
  • C++:为什么这个简单的 Scope Guard 有效?

    到目前为止 每个查看的作用域防护都有一个防护布尔变量 例如 请参阅此讨论 最简单 最简洁的c 11 ScopeGuard 但一个简单的守卫可以工作 gcc 4 9 clang 3 6 0 template