hitmanx
2015-07-16 17:16:47 +08:00
挺有意思的,我做了几个实验。
namespace NS_A
{
class A
{
public:
A(){std::cout << "A ctor" << std::endl;}
~A(){std::cout << "A dtor" << std::endl;}
};
}
namespace NS_B
{
void test()
{
NS_A::A* a = new NS_A::A;
a->~A(); // ok
operator delete(a);
}
}
int main()
{
NS_B::test();
return 0;
}
==============================
但是如果这儿加上一个typedef,情况就不一样了。
namespace NS_A
{
class A
{
public:
A(){std::cout << "A ctor" << std::endl;}
~A(){std::cout << "A dtor" << std::endl;}
};
typedef NS_A::A CloneA; // add typedef here
}
namespace NS_B
{
void test()
{
NS_A::CloneA* a = new NS_A::CloneA;
a->~CloneA(); // oops, we end up with compile error here
operator delete(a);
}
}
int main()
{
NS_B::test();
return 0;
}
===============================================
如果加上一句“using NS_A::CloneA;”,编译就又没有问题了。
同样的,string是一个typedef,原型是模板类basic_string的一个特化。如果这儿改成它的原型,比如改成以下这样,是可以编译的。
int main()
{
std::string *sp = new std::string("hehe");
sp->~basic_string(); // ok now
operator delete (sp);
return 0;
}