You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

《C++ Primer》对dynamic_cast的用法是否存在错误?

《C++ Primer》对dynamic_cast的用法描述是否存在错误?

咱们先直接给出结论:《C++ Primer》第5版19.2.1节里关于dynamic_cast<type*>(e)的描述确实存在错误,其余部分的表述基本符合C++标准。

先把书中的相关内容贴出来:

引自《C++ Primer》第5版19.2.1节:dynamic_cast运算符。dynamic_cast的形式如下:dynamic_cast<type*>(e)、dynamic_cast<type&>(e)、dynamic_cast<type&&>(e)。其中type必须是类类型,且通常是包含虚函数的类。第一种情况中,e必须是有效指针(§2.3.2,第52页);第二种情况中,e必须是左值;第三种情况中,e不能是左值。在所有情况下,e的类型必须是某个公...

问题出在哪?

根据C标准(从C11到最新的C++20/23),对于指针形式的dynamic_cast,e完全可以是空指针——此时转换的结果就是目标类型type*的空指针,这是完全合法且符合标准的用法。书中说“e必须是有效指针”显然和标准规定冲突。

举个简单的验证代码:

#include <iostream>
class Base {
public:
    virtual ~Base() = default; // 虚函数让类成为多态类型
};

class Derived : public Base {};

int main() {
    Base* null_base = nullptr;
    // 合法转换,结果是nullptr
    Derived* null_derived = dynamic_cast<Derived*>(null_base);
    if (null_derived == nullptr) {
        std::cout << "转换结果是空指针,符合预期" << std::endl;
    }
    return 0;
}

这段代码可以正常编译运行,输出预期结果,完全符合标准。

其余描述是否正确?

  • 关于引用形式的dynamic_cast<type&>(e)要求e是左值:这部分是对的,因为左值引用只能绑定左值;如果转换失败,会抛出std::bad_cast异常。
  • 关于dynamic_cast<type&&>(e)要求e不能是左值:这部分也正确,右值引用只能绑定右值或亡值,转换失败同样会抛出异常。
  • 关于type必须是类类型且通常包含虚函数:这部分没问题,因为dynamic_cast主要用于多态类型的向下转换(或跨转换),非多态类型的dynamic_cast会在编译阶段直接报错。

总的来说,书中只是在指针形式dynamic_cast的参数要求上犯了一个小错误,其余部分的描述还是可靠的。

内容的提问来源于stack exchange,提问作者choxsword

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:57:17