如何解决这个`(*(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
即
typedef decltype((*(B*)nullptr).a) BMemberA;
生成与 a
类型的 B
成员相同的类型。另一种更好的解决方案是编写。
typedef decltype(declval<B>().a) BMemberA;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。