gpt4 book ai didi

c++ - 在 `?:` 代码中奇怪地使用 `typeid`

转载 作者:IT老高 更新时间:2023-10-28 13:22:49 26 4
gpt4 key购买 nike

在我正在进行的一个项目中,我看到了这段代码

struct Base {
virtual ~Base() { }
};

struct ClassX {
bool isHoldingDerivedObj() const {
return typeid(1 ? *m_basePtr : *m_basePtr) == typeid(Derived);
}
Base *m_basePtr;
};

我从来没有见过这样使用 typeid。为什么它会用 ?: 做那种奇怪的舞蹈,而不是只做 typeid(*m_basePtr)?有什么理由吗? Base 是一个多态类(带有虚拟析构函数)。

编辑:在这段代码的另一个地方,我看到了这个,它似乎是“多余的”

template<typename T> T &nonnull(T &t) { return t; }

struct ClassY {
bool isHoldingDerivedObj() const {
return typeid(nonnull(*m_basePtr)) == typeid(Derived);
}
Base *m_basePtr;
};

最佳答案

我认为这是一个优化! typeid 的一个鲜为人知且很少(您可以说“从不”)使用的功能是 typeid 的参数的 null 取消引用会引发异常,而不是通常的 UB。

What? Are you serious? Are you drunk?

确实如此。是的。没有。

int *p = 0;*p; // UBtypeid (*p); // throws

是的,这很丑陋,即使按照 C++ 语言丑陋的标准来衡量也是如此。

OTOH,这在 typeid 的参数内部 的任何地方都不起作用,因此添加任何困惑都会取消此“功能”:

int *p = 0;typeid(1 ? *p : *p); // UBtypeid(identity(*p)); // UB

郑重声明:我并没有在此消息中声明编译器在执行取消引用之前自动检查指针是否为空一定是一件疯狂的事情。我只是说,当解引用是 typeid 的直接参数, 而不是其他地方 时进行此检查是完全疯狂的。 (也许是某个草稿中插入的恶作剧,从未被删除。)

声明:我在之前的“声明”中并没有声称编译器插入自动检查指针是否为空,并在出现异常时抛出异常(如在 Java 中)是有意义的。 null 被取消引用:通常,在 null 取消引用上抛出异常是荒谬的。这是一个编程错误,因此异常不会有帮助。调用断言失败。

关于c++ - 在 `?:` 代码中奇怪地使用 `typeid`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6795890/

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