手动调用析构函数不会作为引用变量计算
Manually calling destructor is not evaluated as referencing variable
一旦我的类没有定义析构函数,下面的代码给出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)。
相关文章:
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 多个"常量引用"变量可以共享同一个内存吗?
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- C++方法中的引用变量
- 作为赋值(增加引用变量)C++的左操作数所需的左值
- 使用更改此变量的函数在同一行中打印引用变量
- 将延迟变量分配给引用变量
- 如何通过引用获取引用变量的地址?
- 将引用变量传递给函数
- C++中引用变量的内存?
- 按名称存储和引用变量列表
- 返回一个C++引用变量 VS 返回一个变量
- c++ 在 if 语句中分配引用变量
- 引用变量何时合适,为什么?你能解释一下实际的语法和位置吗?
- C++ - 将一个变量分配给另一个变量和将变量分配给引用变量有什么区别?
- 在类范围内声明时,应在 C++14 中引用变量模板
- 当引用变量的引用"死亡"时,它会发生什么?
- 将非按引用变量分配给返回按引用的函数,反之亦然
- 引用变量如何存储在mem中
- 引用变量存储在哪里