手动调用析构函数不会作为引用变量计算

Manually calling destructor is not evaluated as referencing variable

本文关键字:引用 变量 计算 调用 析构函数      更新时间:2023-10-16

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

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

这是一个bug,还是标准行为?

struct Fred
{
    int a, b;
    //~Fred(){}
};
int main()
{
    char memory[sizeof(Fred)];
    void * place = memory;
    Fred* f = new(place)Fred();
    f->~Fred();
}

这段代码当然是没有意义的(它是最小的工作示例),但是在实际场景中,当编写池分配器并像

那样使用它时,我得到了这个错误
template <typename T>
void CallDestructor(T * t)
{
    t->~T();
}

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

这是一个bug,还是标准行为?

这个特殊的警告("局部变量被初始化但未被引用")是标准中不需要的。就语言而言,初始化局部变量然后不引用它是完全合法的

这是一个信号,表明你的代码可能没有做你想做的事情,所以编译器试图提供帮助,并警告你有问题的结构。("你忘记了什么吗?")这完全是在编译器的领域内,所以即使他们尝试了,它也不能成为"标准行为"。: -)

是的,编译器应该意识到f->...确实构成了对f的引用。所以警告是假阳性。(可能是因为整个东西都被优化掉了,没有操作。)如果您使用高警告级别,就会发生这种情况。

警告,不是一个误差。您可以安全地忽略它,或者使用#pragma warning屏蔽它(因为您正在使用MSVC)。