一旦我的类没有定义析构函数,下面的代码就给出了
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();
}
这段代码当然没有意义(它是最小的工作样本),但是在编写池分配器并使用它时,我在实际场景中得到了这个错误
template <typename T>
void CallDestructor(T * t)
{
t->~T();
}
我使用visual studio 2013警告级别4 我在没有警告的情况下在一些在线编译器上测试了它,但我不确定它们的警告级别是什么
答案 0 :(得分:7)
这是一个错误,还是这种标准行为?
此特定警告(“本地变量已初始化但未引用”)是标准不需要的内容。就语言而言,初始化局部变量然后不引用它是完全合法的。
这表明您的代码可能无法按照您的意图执行操作,因此编译器会尝试提供帮助并警告您有问题的构造。 (“你忘记了什么吗?”)这完全在编译器的范围内,因此即使他们尝试也不能成为“标准行为”。 ; - )
是的,编译器应该意识到f->...
确实构成f
的引用。所以这个警告是错误的假设。 (可能是因为整个事情已被优化掉,成为无操作。)如果您使用高警告级别,就会发生这种情况。
但这是警告,而不是错误。你可以安全地忽略它,或用#pragma warning
掩盖它(因为你正在使用MSVC)。