测试代码如下:
class GarbageCollected {
public:
void operator delete(void*) { }
protected:
GarbageCollected() = default;
~GarbageCollected() = default;
};
class Vector {
public:
void operator delete(void* p) { free(p); }
Vector() {}
~Vector() {}
};
class HeapVector final
: public GarbageCollected
, public Vector {
public:
HeapVector() {}
~HeapVector() { }
};
//
HeapVector ccc;
(&ccc)->~HeapVector(); // 编译报错
(&ccc)->HeapVector::~HeapVector(); // 编译通过
如上, (&ccc)->~HeapVector(); 这样写,会报错:error C2385: 对“delete”的访问不明确, note: 此诊断出现在编译器生成的函数“void *HeapVector::__delDtor(unsigned int)”中。
而第二种写法就没问题了,这就很神奇了。
这两写法按理说是等价的,在clang中也都能编译通过。但看起来第一种写法,vs默认会生成一个__delDtor,里面好像和delete有关系。
查了下,好像是vs的bug。有人提过,不过微软没人修复。
那就先不管了。
其实这个bug是我在用vs编译blink时候发现的。现在blink已经完全不支持vs编译了,痛苦