gcc可以警告当构造函数风格的强制转换行为像旧式强制转换?



应该避免旧式强制转换,原因有很多。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
}

该程序编译没有问题,甚至显示UB。constructor-syntax会好如果Tp类类型和有一个构造函数,该函数接受a类型。

我试图检测除了-Wold-style-cast所做的之外,语法将隐藏旧式强制转换的情况。

有一个bugzilla条目Bug 69818 - warn对指针或引用上的c++函数强制转换表达式(即add - wfunction -cast)提出了这样一个gcc的特性。

Chris Studholme提出了两个备选方案

)警告所有功能表达式的目的地是一个指针或引用类型,或

B)对所有目的类型为指针或引用类型的函数式强制转换表达式发出警告,而等效的static_cast<>()表达式将产生错误。

和后面的注释

另一种选择可能是扩展- world -style-cast,以涵盖函数式强制转换的这些有问题的使用,而不是添加新的警告。

虽然,在线程中没有明确的共识,什么是首选的方式,它是"尚未分配给任何人",最后的贡献是从2018年开始的(该错误被归档为5.2.1)。

据我所知,新版本的gcc没有任何变化。