【发布时间】:2012-12-18 20:41:12
【问题描述】:
在 Andrei Alexandrescu 关于错误处理的演讲中:
见C++ and Beyond 2012: Andrei Alexandrescu - Systematic Error Handling in C++(大约 30 分钟)
Andrei 提供以下代码:
~Expected()
{
using std::exception_ptr;
if (gotHam) ham.~T();
else spam.~exception_ptr();
}
这个析构函数正在清理一个union,它包含一些类型T或std::exception_ptr。联合使用placement new 填充。
Andrei 然后解释说using std::exception_ptr; 是必要的,因为以下代码无法解析:
else spam.~std::exception_ptr();
这意味着如果您需要显式调用不同命名空间中类的析构函数,则始终需要使用 using 指令。
为什么第二个例子不解析?
以下代码会是一个有效的替代方案吗?
else delete spam;
这和显式调用std::exception_ptr的析构函数有同样的效果吗
【问题讨论】:
-
关于后一个问题,没有。
delete包括调用析构函数和调用operator delete。 -
我明白为什么它不能与 std:: 一起使用,但我很惊讶你需要将它带入命名空间。 spam 已经是 exception_ptr 类型,而您只是为使用放置 new 分配的内存调用析构函数? spam 可能是一个引用,而不是你使用的指针。不是 -> 但如果使用了新展示位置,则删除 &spam 也无效。
-
@R. Martinho Fernandes,谢谢,这个问题提供了一些进一步的解释。 stackoverflow.com/questions/6783993/placement-new-and-delete
-
您可以使用 aias 模板解决它:
template<typename T> using alias = T;然后写spam.~alias<std::exception_ptr>()