当使用指针初始化时,如果有多个构造函数接受指针参数,则nullptr可能不明确。
您可以通过强制转换C cast或static_cast来解决此问题,例如:
def readContent = readFile "sample.txt"
writeFile file: "sample.txt", text: "$readContent Version=$projectVersion\n"
echo "${sample.txt}"
我包含了B来说明存在std :: nullptr_t的构造函数是可能的,但对于这个问题,让我们关注A。
从“Why use static_cast(x) instead of (int)x?”我了解C cast最危险的事情是你不知道将使用哪个:
主要原因是经典的C演员之间没有区别 我们称之为static_cast<>(),reinterpret_cast<>(),const_cast<>(), 和dynamic_cast<>()。这四件事完全不同。
对于nullptr,这些演员阵容是否不安全?或者您可以安全地使用C风格演员吗?
答案 0 :(得分:2)
reinterpret
强制转换是不安全的,无论你正在投射什么 - 重点是你强迫编译器忽略它自己的一套(非常好的)规则并相信你(通常是错误的)直觉。 / p>
我认为dynamic_cast
也有点危险,因为它允许你编译向下铸造和侧向铸造。有时当刚刚开始使用它时,这会导致出现令人困惑的NULL指针或运行时错误。
在你的例子中,无关紧要,因为转换是微不足道的,所以你“可以”使用任何东西,但你可能不应该这样做。 C风格的情况可能是静态的,因为它在编译时是硬编码的,所以在你的情况下它并不重要(但你不能确定!它不能保证!)。这更像是一个安全的约定 - 使用static_cast
,因为这是你想要做的,这就是保证它的方法。如果您的代码变得更加先进/复杂/困难,那么“安全”规则可以真正帮助您避免讨厌的错误。
一般情况下,C++
应该不包含原生C
,至少作为初学者,可能大部分时间。
答案 1 :(得分:0)
我觉得如果类允许构造多个指针类型,那么类作者应该对显式空指针负责。
默认位置是不处理空指针,这完全有效。如果作者想要处理显式空指针,则可以添加nullptr_t或no-args构造函数,但如果不是,则用户应将其作为公司设计警告。