Boost.Geometry中明显的空指针解引用问题求教
Boost Geometry中dimension_checker解引用空指针的设计动机
你的猜想完全正确,这段代码是Boost Geometry用于编译期概念检查的技巧,核心就是把*p当作类似std::declval的哑元值来用,具体原因拆解如下:
仅编译期生效,无运行时风险
这段代码只会在编译阶段被实例化并检查语法合法性,不会真的在运行时执行(Boost的概念检查机制仅作用于编译期)。编译器只会验证geometry::get<Dimension>(*p)和geometry::set<Dimension>(*p, ...)这两个调用的类型是否合法,不会实际执行解引用空指针的操作,因此不会触发运行时崩溃。避免构造实例,兼容更多类型
直接构造P的实例可能存在限制:比如某些P类型没有默认构造函数,或者构造过程有额外开销。而声明空指针并解引用的方式,不需要调用P的构造函数就能得到一个P&类型的表达式,刚好满足get和set函数对参数类型的要求。兼容旧C++标准
在C11引入std::declval<T>()之前,这类“无需构造就能获取类型表达式”的需求,通常就用空指针解引用这种技巧来实现。Boost Geometry的这段代码可能是为了兼容C03及更早的标准才这么写的。
简单来说,这是一种编译期特有的“语法占位”手段,用看似危险的写法完成安全的类型检查,本质是利用了编译器只检查类型合法性、不执行代码的特性。
内容的提问来源于stack exchange,提问作者TwistedBlizzard
相关产品推荐
相关产品推荐

