在 Andrei Alexandrescu 关于错误处理的演讲中:
请参阅C++ 和超越 2012:Andrei Alexandrescu - C++ 中的系统错误处理(大约 30 分钟)
Andrei 提供了以下代码:
~Expected()
{
using std::exception_ptr;
if (gotHam) ham.~T();
else spam.~exception_ptr();
}
这个析构函数正在清理union
包含某种类型T
或 a 的 a std::exception_ptr
。联合使用 填充placement new
。
Andrei 然后解释说这using std::exception_ptr;
是必要的,因为以下代码不会解析:
else spam.~std::exception_ptr();
这意味着如果您需要显式调用不同命名空间中类的析构函数,则始终需要使用 using 指令。
为什么第二个示例不解析?
以下代码会是一个有效的替代方案吗?
else delete spam;
这是否与显式调用析构函数具有相同的影响std::exception_ptr