手动调用析构函数不会被评估为引用变量

rel*_*xxx 7 c++ placement-new

一旦我的类没有定义析构函数,下面的代码给出 warning C4189: 'f' : local variable is initialized but not referenced

(f->~Fred()未被识别为引用f)

这是一个错误,还是这个标准行为?

struct Fred
{
    int a, b;
    //~Fred(){}
};

int main()
{
    char memory[sizeof(Fred)];

    void * place = memory;

    Fred* f = new(place)Fred();

    f->~Fred();
}
Run Code Online (Sandbox Code Playgroud)

这段代码当然没有意义(它是最小的工作样本),但是在编写池分配器并使用它时,我在实际场景中得到了这个错误

template <typename T>
void CallDestructor(T * t)
{
    t->~T();
}
Run Code Online (Sandbox Code Playgroud)

我使用visual studio 2013警告级别4我在一些在线编译器上测试它而没有警告,但我不确定他们的警告级别是什么

Dev*_*lar 7

这是一个错误,还是这个标准行为?

此特定警告("局部变量已初始化但未引用")是标准不需要的.就语言而言,初始化局部变量然后不引用它是完全合法的.

但是,这表明您的代码可能无法按照您的意图执行操作,因此编译器会尝试提供帮助并向您发出有关可疑构造的警告.(" 你忘了这里的东西吗? ")这完全属于编译器的范畴,所以即使他们尝试过它也不能成为"标准行为".;-)

是的,编译器应该意识到它f->...确实构成了引用f.所以这个警告是错误的假设.(可能是因为整个事情已被优化掉,成为无操作.)如果您使用高警告级别,就会发生这种情况.

但这是一个警告,而不是错误.你可以放心地忽略它,或者用它来掩盖它#pragma warning(因为你正在使用MSVC).