gpt4 book ai didi

c++ - 为什么在声明对象 std::vector 但从未使用时编译器不发出警告?

转载 作者:IT老高 更新时间:2023-10-28 22:11:12 25 4
gpt4 key购买 nike

#include <vector>

class Object
{
};

int main()
{
Object myObject;
std::vector<int> myVector;
}

编译器发出:

warning: unused variable 'myObject' [-Wunused-variable]

myVector 没有警告。为什么?有什么办法可以启用吗?

最佳答案

通常无法确定是否声明(并因此初始化并在某些时候破坏)任意对象具有可见的副作用。构造函数可能正在调用编译器不知道其定义的函数,或者它可能取决于外部状态或任何其他使问题无法确定的方面。

在您的第一种情况下,构造函数是微不足道的(甚至没有声明),析构函数也是如此。由于 Object 没有成员,因此很明显,Object foo 实际上什么也没做。

std::vector 有一个重要的构造函数,它可能正在分配内存(外部状态 + 可能未知定义的函数 (new ...))连同一个重要的析构函数(也是外部状态 + 其定义可能未知的函数 (delete ...))。在这种情况下,无法推断删除声明是否安全(因此发出警告提示您可能应该这样做),因此编译器必须将声明留在代码中(并且必须假设声明存在一段时间)原因)。

一个典型的例子是std::lock_guard用于在构造互斥体时锁定互斥体,在破坏时自动解锁。因此,只要对象在范围内,互斥锁就会被持有;通常你根本不会访问 std::lock_guard 对象——尽管声明它是有用的。这就是 RAII 原则在起作用。

在这种情况下发出警告会令人讨厌,导致人们关闭警告,这反过来又会使警告变得无用。 (编译器甚至可以设计为仅在优化期间删除声明时才发出警告,这也是某些警告仅在启用某些优化时才显示的原因。)

关于c++ - 为什么在声明对象 std::vector 但从未使用时编译器不发出警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37918140/

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