GCC 4.7.2:带有指向成员函数指针的 std::thread

2024-04-12

在编写测试代码时这个问题 https://stackoverflow.com/questions/15080015/stdthread-with-pointer-to-data-member我发现下面的注释行无法在 GCC 4.7.2 上编译:

#include <thread>
#include <iostream>

struct S {
    void f() {
        std::cout << "Calling f()" << std::endl;
    }
};

int main()
{
    S s;
    // std::thread t(&S::f, s); // does not compile?
    std::thread t(&S::f, &s);
    t.join();
}

但 cppreference 似乎声称“this”参数可以等效地作为对象、对象引用或对象指针传递:

如果 f 是指向类 T 的成员函数的指针,则调用它。返回值被忽略。实际上,执行了以下代码: (t1.*f)(t2, ..., tN) 如果 t1 的类型是 T、对 T 的引用或对从 T 派生的类型的引用。 ((*t1).*f)(t2, ..., tN) 否则。

我实际上认为这听起来很糟糕,并且更喜欢std::thread只允许指针或引用语义,而不是互换地接受它们,但考虑到它似乎应该如此,上面是 GCC/libstdc++ 错误(还是我误解了 cppreference)?


看来今晚是GCC 错误派对 https://stackoverflow.com/questions/15079947/obviously-ambiguous-call-does-not-cause-a-compilation-error-on-gcc#comment21209484_15079947 :-)

抛开笑话不谈,这肯定是一个bug. 我对链接问题的回答 https://stackoverflow.com/questions/15080015/stdthread-with-pointer-to-data-member/15080378#15080378其实已经有证明了,但由于没有强调,所以这里再重复一下。

这就是如何INVOKE设施,就其行为而言std::thread的构造函数(请参阅链接的答案)在 C++11 标准中定义

Define 调用 (f, t1, t2, ..., tN)如下:

(t1.*f)(t2, ..., tN) 当 f 是指向类 T 的成员函数的指针且 t1 是 类型 T 或对类型 T 的对象的引用或对从 T 派生的类型的对象的引用;

— ((*t1).*f)(t2, ..., tN) 当 f 是指向类 T 的成员函数的指针并且 t1 不是以下之一时 前一项中描述的类型;

— t1.*f 当 N == 1 且 f 是指向类 T 的成员数据的指针且 t1 是类型 T 或 a 的对象时 对类型 T 的对象的引用或对从 T 派生的类型的对象的引用;

— (*t1).*f 当 N == 1 并且 f 是指向类 T 的成员数据的指针并且 t1 不是其中一种类型时 前一项中描述;

— 在所有其他情况下为 f(t1, t2, ..., tN)。

粗体字的句子有效地指定了该行:

std::thread t(&S::f, s);

应该编译。因此,这符合bug.

此外,它可以在 GCC 4.8.0(测试版)和 Clang 3.2 上进行行编译。

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

GCC 4.7.2:带有指向成员函数指针的 std::thread 的相关文章

随机推荐

  • 找不到方法 getAndroidDeviceInfo 的实现

    我正在尝试运行这个example https github com flutter plugins tree master packages device info example在插件页面中 我收到这个错误 I flutter 3273
  • 如何在重定向到我的应用程序后关闭 Android 浏览器?

    重定向到我的应用程序后如何关闭浏览器 有什么办法可以做到这一点吗 据我所知 不可能影响其他活动 例如关闭等
  • 删除列表中复杂度优于 O(n^2) 的子字符串

    我有一个包含许多单词 100 000 的列表 我想做的是删除列表中每个单词的所有子字符串 因此 为了简单起见 我们假设我有以下列表 words Hello Hell Apple Banana Ban Peter P e 以下输出是所需的 H
  • 同时获取logcat和内核日志

    我正在尝试通过以下命令获取日志 logcat 和 kmsg logcat v 时间 f dev kmsg cat proc 但是我不确定日志文件存储在哪里以及它的名称是什么 我如何识别它 好的 这是谷歌快速搜索的结果 安卓日志系统 http
  • Haskell 中的 undefined 和 Java 中的 null 有什么区别?

    两者的类型都是所有类型的交集 无人居住 两者都可以在代码中传递而不会失败 直到尝试评估它们为止 我能看到的唯一区别是 在 Java 中 有一个漏洞允许null仅针对一个操作进行评估 即引用相等比较 而在 Haskell 中undefined
  • 设置特定文件的 AWS S3 过期时间

    我阅读了 PHP AWS SDK 文档 https docs aws amazon com aws sdk php v2 api class Aws S3 S3Client html https docs aws amazon com aw
  • 二分布局Gephi 0.9.1

    我的问题简单得令人尴尬 how do i plot a bipartite graph in Gephi with a layout like the one you see in the attached image 我真的无法在Geph
  • 是否可以通过显式类型转换将基类对象分配给派生类引用?

    是否可以在 C 中使用显式类型转换将基类对象分配给派生类引用 我已经尝试过了 它会产生运行时错误 不可以 对派生类的引用实际上必须引用派生类的实例 或 null 否则你会期望它如何表现 例如 object o new object stri
  • Jetty 返回 403 Forbidden

    您好 我正在将我的网络应用程序从 tomcat 移植到 Jetty 我正在使用 Jetty runner 来启动它 我使用以下命令来启动 Jetty java jar jetty runner jar port path url path
  • psql 显示 ansi 彩色文本

    My psqlrc有以下选项 setenv LESS iMSx4 FXR setenv PAGER less pset pager always 我想要着色的 psql 输出是 x1B 35m x1B 0m x1B 35mr x1B 0m
  • 检测Python字符串是数字还是字母[重复]

    这个问题在这里已经有答案了 如何检测字符串中的数字或字母 我知道您使用 ASCII 代码 但是哪些函数利用了它们呢 检查字符串是否为非负的数字 整数 和字母 您可以使用str isdigit https docs python org 2
  • 使用 async/await 锁定资源

    我有一个应用程序 其中有一个可由多个客户端访问的共享资源 运动系统 我有一些单独的操作 需要在移动期间访问系统 并且如果同时请求冲突的操作 则应抛出 繁忙 异常 我还有序列器 它们需要获得对运动系统的独占访问权限 以执行多个操作 并穿插其他
  • Objective-C 类别性能

    如果我使用类别将 Objective C 类的实现分解为多个 implementation块 这会使我的 iOS 应用程序生成的二进制文件更大或根本影响性能吗 显然 你不能在运行时获取类的类别详细信息 https stackoverflow
  • 为什么从 App.xaml 设置样式 TargetType="Window" 不起作用?

    我正在 VS2013 中创建一个简单的 WPF 项目 我想将属性应用到我的主窗口 我将它们设置在我的App xaml像这样的文件
  • “入队”和“出队”之间的区别

    有人可以解释一下主要区别吗 我对任何语言编程中的这些函数都没有明确的了解 C 和 C 等编程语言中的一些基本数据结构是堆栈和队列 堆栈数据结构遵循 先进后出 策略 FILO 其中插入或 推入 堆栈的第一个元素是最后一个从堆栈中删除或 弹出
  • 使用 jquery ajax 的两个 CORS 请求之间的时间间隔

    我正在使用 jQuery 向 Web 服务发出 CORS 请求 ajax 根据标准 有一个飞行前请求 然后是实际的 POST 请求 我注意到 每次我尝试进行 Web 服务调用时 都会有两个请求 一个是飞行前请求 一个是实际的 POST 请求
  • ASP.NET - 将 JSON 从 jQuery 传递到 ASHX

    我正在尝试将 JSON 从 jQuery 传递到 ASHX 文件 下面的 jQuery 示例 ajax type POST url test ashx data file dave type ward contentType applica
  • SQL Regex 函数类似于 MySql REGEX 函数

    我正在寻找一个能够执行与 TSQL 的 MySQL REGEX 函数相同的操作的函数 基本上我需要我的查询如下所示 SELECT FROM Routing WHERE Message REGEX RouteRegex 我现在不太热衷于使用
  • C++处理文件文件末尾的空行

    当我使用c 处理文件时 我发现文件末尾总是有一个空行 有人说vim会在文件末尾追加一个 n 但是当我使用gedit时 它也有同样的问题 谁能告诉我原因吗 1 include
  • GCC 4.7.2:带有指向成员函数指针的 std::thread

    在编写测试代码时这个问题 https stackoverflow com questions 15080015 stdthread with pointer to data member我发现下面的注释行无法在 GCC 4 7 2 上编译