r0n*_*0ng 5 c++ template-specialization
我有以下代码仅用于测试,模板函数使用两次,第一次没问题.在第二种情况下,我创建一个指针并将指针作为参考传递给模板函数.我期望行"obj.~T()"编译时失败.但实际上代码编译并运行良好.当我通过函数调试时,程序只是跳过obj.~T(); 我正在使用VC10.
我的问题是:
1.这是预期的行为吗?如果它基于c ++标准的哪个部分?
2.关于这种行为的任何赞成和反对?在我的情况下它是好的,因为没有编译错误既没有运行时错误.但可能有一些情况我不知道,但确实损坏了代码.
谢谢
template<typename T>
void ptrDest(T& obj)
{
obj.~T();
}
class Dummy
{
public:
Dummy(){}
~Dummy(){ cout << "dest" <<endl;}
};
int main()
{
Dummy d;
ptrDest(d);
Dummy* pd = new Dummy();
ptrDest(pd);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是一个显式的析构函数调用,它是一个有效的操作,虽然不一定被认为是一种好的做法.如果可能,请考虑使用范围变量.
在你的第二次调用中,你实际上是在尝试调用指针的析构函数,它确实不存在,而不是指向对象的析构函数,这就是它跳过它的原因.但是,请注意,您的Dummy对象仍然在第二次调用后分配,并且您将在所有情况下泄漏.
模板替换会导致伪析构函数调用表达式或析构函数的函数调用。这些在语言语法中是相同的,但语义不同:
\n\n对于诸如指针之类的基本类型,允许伪析构函数调用 (C++11 \xc2\xa75.2.4),但它不执行任何操作。
显式析构函数调用是一种函数调用,它经过名称查找并形成函数调用表达式 (C++11 \xc2\xa75.2.2)。
任何与模板中伪析构函数调用的语法相匹配的内容也可能是格式良好的函数调用(显式析构函数调用),反之亦然。
\n\n因此,如果您看到关于 的析构函数的两条消息d,而没有看到关于 的析构函数的消息dp,那么您正在观察预期的行为。
| 归档时间: |
|
| 查看次数: |
267 次 |
| 最近记录: |