gpt4 book ai didi

c++ - 手动调用析构函数未被评估为引用变量

转载 作者:可可西里 更新时间:2023-11-01 18:31:27 33 4
gpt4 key购买 nike

一旦我的类没有定义析构函数,下面的代码给出警告 C4189:“f”:局部变量已初始化但未被引用

(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();
}

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

template <typename T>
void CallDestructor(T * t)
{
t->~T();
}

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

最佳答案

Is this a bug, or is this standard behaviour?

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

不过,这表明您的代码可能没有按照您的预期执行,因此编译器会尽力提供帮助并警告您有关有问题的结构。 (“你在这里忘记了什么吗?”)这完全在编译器的范围内,所以即使他们尝试了,它也不是“标准行为”。 ;-)

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

但这是一个警告,而不是一个错误。您可以安全地忽略它,或使用 #pragma warning 将其屏蔽掉(因为您使用的是 MSVC)。

关于c++ - 手动调用析构函数未被评估为引用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32091833/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com