2017-07-31 35 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

我想這是由於編譯期間的優化而發生的。如果編譯器看到對象創建,並且該變量未被使用,那麼編譯器將其刪除。這就是爲什麼我們沒有看到警告,否則變量被保留並引發警告。但這只是我的假設。你怎麼看待這件事? –

相關問題