停止对operator delete的隐式强制转换

Goz*_*Goz 1 c++ memory-management implicit-cast

我的String类提供了一个运算符char*重载,允许您将字符串传递给C函数.

不幸的是,我的一位同事无意中发现了一个错误.

他实际上有以下代码.

StringT str;
// Some code.
delete str;
Run Code Online (Sandbox Code Playgroud)

反正是否有阻止删除将字符串对象强制转换为char*以防止将来出现这样的错误? std::string通过不提供char运算符重载来解决这个问题,但理想情况下,我想保持重载但阻止该删除工作.

MSa*_*ers 8

是.通过声明(但不定义!)提供两个隐式强制转换 operator char const volatile*.当您传递StringT给C字符串函数时,重载分辨率仍将选择原始operator char const*(完全匹配).但delete str;现在变得含糊不清.

声明可以是私有的,因此如果以某种方式选择它将是编译时错误.预期的歧义发生在重载解决之前 - private唯一能够捕获极其罕见的情况,即volatile以某种方式选择过载.


sbi*_*sbi 5

反正是否有阻止删除将字符串对象强制转换为char*...?

是的:回避隐式投射操作员.这已经被传播了至少十年了.相信它,你将过上更幸福的生活.