typeid 不适用于非静态成员函数

2023-12-28

clang不编译第三次调用typeid下面(参见活生生的例子 http://coliru.stacked-crooked.com/a/e61efc069f27dc35)。但我在第 5.2.8 节中看不到任何不允许这样做的内容,特别是当我们认为表达式B::f不是多态类类型的左值(参见第 3 段)。另外,根据本段的表达式B::f是一个未评估的操作数,因此,调用typeid(B::f)应该编译。注意GCC不编译任何调用typeid below:

#include <iostream>
#include <typeinfo>

struct A{ int i; };
struct B{ int i; void f(); };

int main()
{
    std::cout << typeid(A::i).name() << '\n';
    std::cout << typeid(B::i).name() << '\n';
    std::cout << typeid(B::f).name() << '\n';
}

据我所知clang是正确的,使用非静态成员仅在未评估的上下文中有效(如果它是数据成员)。所以看起来像gcc对于前两种情况是不正确的,但是gcc在以下情况下可以正常工作sizeof and decltype其中也有未评估的操作数。

来自C++11 标准草案 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf部分5.1.1 [expr.prim.general]:

表示非静态数据成员或非静态的 id 表达式 类的成员函数只能使用:

并包括以下项目符号:

如果该 id 表达式表示非静态数据成员并且它出现 在未评估的操作数中。[ 例子:

struct S {
    int m;
};
int i = sizeof(S::m); // OK
int j = sizeof(S::m + 42); // OK 

—结束示例]

其余项目符号不适用,如下:

  • as part of a class member access (5.2.5) in which the object expression refers to the member’s class61 or a class derived from that class, or
  • 形成一个指向成员的指针(5.3.1),或者
  • 在该类或从该类派生的类的构造函数的 mem-initializer 中 (12.6.2),或者
  • 在该类或从该类派生的类的非静态数据成员的大括号或等于初始化程序中 (12.6.2),或

我们知道操作数未从节中求值5.2.8其中说:

当 typeid 应用于除 a 的左值之外的表达式时 多态类类型,[...]表达式是未计算的操作数 (第 5 条)。

从语法中我们可以看出id-表达式是一个不合格的 ID or a 合格的 ID:

id-expression:
    unqualified-id
    qualified-id

Update

提交了海湾合作委员会错误报告:typeid 不允许使用表示非静态数据成员的 id 表达式 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68604.

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

typeid 不适用于非静态成员函数 的相关文章

随机推荐

  • AngularJS使用loadsequence和auth权限进行多重解析

    参考这个问题在这里 https stackoverflow com questions 33431797 angularjs multiple resolve 我有同样的问题 我们如何设置多重解析 其中一个当前验证另一个与加载顺序哪个加载控
  • WITH 语句是每个查询执行一次还是每行执行一次?

    我对WITH语句 CTE 的理解是它每个查询执行一次 通过这样的查询 WITH Query1 AS SELECT FROM SomeTable t1 LEFT JOIN Query1 t2 ON 如果这导致 100 行 我预计Query1只
  • 增量运算符返回 NaN

    我正在尝试使用以下方法来增加变量 运算符 但我不断得到NaN结果 我不知道为什么 这是我的代码 var wordCounts var x 0 var compare groove is in the heart var words comp
  • 改造错误:预期为 BEGIN_ARRAY,但实际为 STRING

    在api响应中有时可以是数组 有时可以是字符串 这里的详细信息是数组 ts 2015 06 16 11 28 33 success true error false details user id 563 firstname K Matha
  • 在 Android 中使用 httpUrlConnection 发送授权标头

    我试图在使用 HttpUrlConnection 时设置 Authorization 标头 但我在服务器上看到它为 HTTP AUTHORIZATION 这是我的代码 public static String doGet String pa
  • 如何在 PHP 中返回文件

    我有一个文件 file zip 一个用户来到 download php 我希望用户的浏览器开始下载文件 我怎么做 readfile 是否打开服务器上的文件 这似乎是不必要的事情 有没有办法返回文件而不在服务器上打开它 我想你想要这个 att
  • 如何使用PDO和bindParam将数组插入mysql?

    我正在使用以下代码 该代码有效 但我想更改它以便它使用bindparam try dbh new PDO mysql host hostname dbname dbname username password stqid array for
  • 如何增加 C# 应用程序中 mysql 连接的连接超时?

    我想增加 mysql 连接的连接超时 但无法从 mysql 服务器的管理员面板修改超时设置 我想在 C 应用程序中执行此操作 并且我注意到我可以读取该属性连接超时 of MySql连接班级 我想知道有没有办法在打开 mysql 连接之前增加
  • eclipse可以调试或运行一个项目中的两个程序

    eclipse调试可以在一个项目中运行两个程序吗 我的意思是我有两个程序public static void main 方法 可以同时调试它们吗 我已经尝试这样做了 有两个显示控制台 调试窗口中有两个线程 您可以单击该线程来决定要调试哪个程
  • 使用create_task()还是gather()效率更高?

    我仍处于异步 python 的基础知识中 有些事情让我感到困惑 import asyncio loop asyncio get event loop for variation in args loop create task corout
  • 使用 FXML 的 JavaFX 窗口更换器

    我目前正在尝试在单击按钮时制作窗口 场景 更改器 具体来说 是在用户登录时更改窗口 我想知道如何减少冗余代码 并将负责更改窗口的方法放在一个集中的位置 是否有特定的设计模式可遵循 到目前为止 我有这个 主程序 java public cla
  • 如何从列中删除浮点值 - pandas

    我有一个数据框 如下所示 df pd DataFrame subject id 1 1 1 1 1 1 val 5 6 4 5 4 6 6 6 看起来如下图所示 我想放弃values from val以以下结尾的列 1 9 基本上我想保留这
  • 如何在PHP中使电子邮件链接在X分钟后过期?

    我正在处理电子邮件链接 一段时间后就会过期X分钟 其中X表示一些随机日期时间 所以我的动机是在一段时间后使链接过期 无论我在其中设置 date time 过期日期 所以我自己创建了虚拟代码只是为了确保我的代码是否有效 currentDate
  • TSql 触发器只需要在值已更改的列上触发

    我编写了一个触发器 需要根据行中实际更新的列对表执行一些不同的工作 我使用以下方法完成了此操作 IF UPDATE column name 那部分工作正常 然而 事实证明 代码的其他部分通过设置每个值来更新行 无论该值是否实际更改 这会导致
  • 悬停效果不适用于 IE8

    我使用 CSS 来改变表格悬停时的颜色 tabb tbody tr hover td color 006 background d0e4f2 这在 Chrome 和 Firefox 中运行良好 但在 Internet Explorer 8
  • 我应该如何解释 numpy.fft.rfft2 的输出?

    显然 rfft2 函数只是计算输入矩阵的离散 fft 但是 如何解释输出的给定索引 给定输出的索引 我要查看哪个傅立叶系数 我对输出的大小特别困惑 对于 n n 矩阵 输出似乎是 n n 2 1 矩阵 对于偶数 n 为什么方阵最终会得到非方
  • 用标记而不是箭头进行注释

    我该如何获取这段代码 import matplotlib pyplot as plt fig plt figure ax fig add subplot 111 x 1 2 3 4 5 6 7 8 9 10 y 1 1 1 2 10 2 1
  • 如何避免在 Facelets 页面中重复/使用常量?

    在 Facelets 页面中 我有各种
  • 在 awk 中转置两个字段

    假设一个文件如下所示 a b c d a b c d a b c d 如何转置两个字段 例如 c b a d c b a d c b a d 提前致谢 这是另一个解决方案 交换第一个和第三个字段 然后打印 awk F temp 1 1 3
  • typeid 不适用于非静态成员函数

    clang不编译第三次调用typeid下面 参见活生生的例子 http coliru stacked crooked com a e61efc069f27dc35 但我在第 5 2 8 节中看不到任何不允许这样做的内容 特别是当我们认为表达