gpt4 book ai didi

C++: *((SomeType*) 0 )?

转载 作者:太空狗 更新时间:2023-10-29 23:33:29 28 4
gpt4 key购买 nike

我遇到过几次这种句法结构,我想知道:

  1. 这是做什么的?
  2. 设计推理可能是什么?

它看起来像这样:

struct SubType : public SomeSuperType {

SubType(int somthing) : SuperType(something), m_foo(*((FooType *)0))
{}

private:
FooType m_foo;
}

需要说明的是,代码有效。但目的是什么?如果没有该行,m_foo 会是什么状态?

最佳答案

此构造的目的是在您正式需要一个对象但不想要或不能声明一个真实对象的情况下,模拟一个类型为 SomeType 的假未命名对象。它有其有效用途,不一定会导致未定义的行为。

一个典型的例子是确定某个类成员的大小

sizeof (*(SomeClass *) 0).some_member

或decltype的类似应用

decltype((*(SomeClass *) 0).some_member)

以上示例都不会导致任何未定义的行为。在非评估的上下文中,像 *(SomeClass *) 0 这样的表达式是完全合法和有效的。

您还可以在语言标准本身中看到这种用于说明目的的技术,如 8.3.5/12

A trailing-return-type is most useful for a type that would be more complicated to specify before the declarator-id:

template <class T, class U> auto add(T t, U u) -> decltype(t + u); 

rather than

template <class T, class U> decltype((*(T*)0) + (*(U*)0)) add(T t, U u);

观察 (*(T*)0) + (*(U*)0) 表达式如何在 decltype 下执行编译时预测TU 类型之间的二进制 + 运算符的结果类型。

当然,再次强调,这些技巧只有在非评估上下文中使用时才有效,如上所示。

有时它被用作“空引用”的初始值设定项

SomeType &r = *(SomeType *) 0;

但这实际上跨越了合法的边界并产生了未定义的行为。

您在特定示例中的内容无效,因为它试图在评估的上下文中访问无效的“空左值”。

附言在 C 语言中,规范中还有一个特殊的部分,表示运算符 &* 相互抵消,这意味着 &*(SomeType *) 0 有效并保证计算为空指针。但它不会扩展到 C++。

关于C++: *((SomeType*) 0 )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13766559/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com