微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

这个`(*(T*)nullptr)` 老把戏是什么?

如何解决这个`(*(T*)nullptr)` 老把戏是什么?

我刚刚阅读了 Is declval<T>() the same as (*(T*)nullptr)? 并意识到我以前从未听说过 (*(T*)nullptr) 技巧。如果我分析那个片段,它不会给我太多信息,除此之外(引用答案)

您可以在 decltype 中获取 T 的实例,而无需担心 T 的构造函数

还有发现的例子非常简单:

struct B {
    A a;
};
typedef decltype((*(B*)nullptr).a) T1;

所以,请有人向我解释一下这个 (*(T*)nullptr) 技巧是什么以及我为什么(以及如何)想要使用它(除了上面的例子)?

编辑: decltype(B::a) 具有相同的含义 (https://gcc.godbolt.org/z/Pvjjza) 那么为什么要像这样把它复杂化呢?这个技巧的出现是否有任何历史意义(例如某些编译器不支持它或其他更有用的东西?)

解决方法

nullptr 是空指针是的!

(B*)nullptr 将空指针转换为指向 B 类型对象的指针。

*(B*)nullptr 取消引用此指针以获取对类型 B 的对象的引用

(*(B*)nullptr).a 访问此引用的成员“a”。

现在,如果您在正在运行的程序中实际执行此操作,您可能会导致程序崩溃或数据损坏,或者可能什么也不会发生,因为undefined behaviour。无论如何,它是坏的和邪恶的,永远不应该在真正的程序中看到。

但是如果将整个表达式括在 decltype 中,您将获得表达式的返回类型,而不是执行表达式。

但是,您可以使用 declval 代替上面的丑陋。但只能在 decltype

内使用 declval

typedef decltype((*(B*)nullptr).a) BMemberA;

生成与 a 类型的 B 成员相同的类型。另一种更好的解决方案是编写。

typedef decltype(declval<B>().a) BMemberA;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。