【发布时间】:2021-12-02 19:23:45
【问题描述】:
出于多种原因,应避免使用旧式强制转换。 gcc 提供了方便的-Wold-style-casts 来检测它们。这可以正常工作,但对于非类类型,构造函数样式转换的行为与旧样式转换完全相同,只是减去了警告。
例子:
struct T {};
int main() {
int const* a = nullptr;
using Tp = T*; // float*, unsigned*, pick whatever
Tp b = Tp(a); // <---- hidden old-style cast: (Tp)a
*b = T{}; // ub
}
这个节目compiles without problems,甚至还展出了UB。如果 Tp 是一个类类型并且有一个接受 a 类型的构造函数,那么构造函数语法就可以了。
除了-Wold-style-cast 所做的事情之外,我试图只检测语法会隐藏旧式转换的情况。
【问题讨论】:
-
c 样式转换为
(type)object,type(object)称为函数样式转换,警告未涵盖 -
@NathanOliver 是的,我意识到它没有被涵盖,我正在尝试找到一种方法来也获得
type(object)的警告,如果类型是非类类型。 -
你可以开始使用 C++ 风格的强制转换。
static_cast<Tp>(a)将导致没有任何编译器标志的错误。 -
@bitmask 您需要修改编译器以添加所需的警告。
-
@NathanOliver:我愿意。不幸的是,代码库中充满了它们。
标签: c++ gcc casting compiler-warnings