2017-07-31 40 views
0

你能帮我理解为什么我得到unused-variable警告不是所有未使用的静态const变量吗? 我准备了一个简单的代码。这里有两个文件main.cpp和incl.h.未使用的变量警告是不是所有未使用的静态const变量

incl.h

#ifndef INCL_H 
#define INCL_H 

struct A 
{ 
    static A& instance() 
    { 
     static A a; 
     return a; 
    } 
}; 

static const A a = A::instance(); 
static const A& b = A::instance(); 

#endif 

的main.cpp

#include "incl.h" 

int main() 
{ 
    return 0; 
} 

我预计会有2未使用变量警告(a和b fariables),但事实上他的警告是唯一一个用于变量b

$ g++ -std=c++11 -Wall -Wextra -O2 -c main.cpp 
In file included from main.cpp:1:0: 
incl.h:14:17: warning: ‘b’ defined but not used [-Wunused-variable] 
static const A& b = A::instance(); 

为什么不变量一个原因相同的警告?

+0

我想你会看到与任何类类型相同的现象。 – molbdnilo

+0

你使用的是哪个版本的g ++系列? – Jonas

+0

@Jonas,g ++版本是5.4.1 –

回答

1

对于变量a,单例实例通过赋值被复制到变量中,所以您可以争辩说它正在被使用。

+0

好吧,让我们concider变量a被使用,因为它是通过复制创建的。我建议将变量b的定义更改为“static const A&b = a;”。在这种情况下,根本不会有任何警告。哪里使用varible b?另外我可以通过“static const A a = A();”创建变量a“而且也不会有警告。 –

+0

我想这是由于编译期间的优化而发生的。如果编译器看到对象创建,并且该变量未被使用,那么编译器将其删除。这就是为什么我们没有看到警告,否则变量被保留并引发警告。但这只是我的假设。你怎么看待这件事? –

相关问题