为什么有unused-but-set variable-warning with pointers

Why there is unused-but-set variable-warning with pointers

我有以下代码:

#include <iostream>

class Test
{
public:
    
    Test(int i)
    {
        initialize(i);
    }
    
    void initialize(int i)
    {
        std::cout<<"i: "<<i<<std::endl;
    }
};



int main()
{
    Test* obj1(nullptr);
    obj1 = new Test(2);
    
    Test* obj2(nullptr);
    obj2 = new Test(2);
    obj2->initialize(3);    
    
    return 0;
}

当我这样编译时 (GCC v11.2.0):

g++ -Wall --std=c++11 main.cpp

我看到以下警告:

main.cpp: In function ‘int main()’:
main.cpp:25:15: warning: variable ‘obj1’ set but not used [-Wunused-but-set-variable]
   25 |         Test* obj1(nullptr);
      |               ^~~~

我的问题是,为什么对 obj1 有警告,而对 obj2 几乎没有警告?

这里要意识到的关键是您的代码中实际上有四个对象——class Test 的两个实例和两个指针。 Test 的实例没有名称(它们是用 new 创建的),而指针确实有名称(obj1obj2)。

这里的警告是关于指针对象 obj1 的,它只被分配给而没有被使用。它在最终分配之后指向的对象在该分配之前具有各种副作用的事实无关紧要。您可以在不影响程序的行为或输出的情况下删除赋值声明(但不是赋值中的新调用)。

int main()
{
    new Test(2);
    
    Test* obj2(nullptr);
    obj2 = new Test(2);
    obj2->initialize(3);    
    
    return 0;
}