2014-12-01 109 views
5

在以下代碼中,除構造函數外,模板結構BB和CC幾乎相同。模板BB使用一個不做任何事的構造函數,而模板CC使用默認的構造函數。當我使用Visual Studio 2013更新4編譯它,拋出一個錯誤在聲明constInst2但不能在聲明constInst行線:隱式構造函數與「空」構造函數

錯誤C4700:未初始化的局部變量「INSTANCE2」使用」

初始化「實例」,以及當我希望同樣的錯誤。我是不是誤解this sentence

「如果隱式聲明的默認構造函數沒有被刪除或 瑣碎,它被定義(即,產生一個函數體和 編譯)由編譯器,它具有恰好與空體和空初始化列表一個 用戶定義的構造相同的效果。」

struct AA 
{ 
    typedef int a; 
    typedef const int b; 
}; 

template< typename A > 
struct BB 
{ 
    typename A::a a_A; 
    typedef typename A::b a_B; 

    BB() 
    {}; 
}; 

template< typename A > 
struct CC 
{ 
    typename A::a a_A; 
    typedef typename A::b a_B; 

    CC() = default; 
}; 

int main() 
{ 
    BB<AA> instance; 
    BB<AA>::a_B constInst(instance.a_A); 

    CC<AA> instance2; 
    CC<AA>::a_B constInst2(instance2.a_A); 

    return 0; 
} 
+1

當詢問有關特定編譯器錯誤的問題時,請在問題中包含完整的錯誤消息。它有很多幫助。 – 2014-12-01 20:55:10

+0

@MarkRansom:更新了問題。 – Hector 2014-12-01 20:57:56

+0

@Hector我把你的代碼逐字記錄下來,用Visual Studio 2013 Update 4進行編譯,並且只收到警告:'警告C4700:未初始化的局部變量'instance2'used'它也編譯時沒有問題:http:// ideone。 com/Hc1jB4 – PaulMcKenzie 2014-12-01 21:01:16

回答

1

在Visual Studio中有一個編譯器標誌將警告視爲錯誤(/ WX)。您可以關閉該標誌以不將警告視爲錯誤。您也可以選擇忽略特定警告(/ wd4100禁用警告C4100)。

你所看到的是一個正在被視爲錯誤的編譯器警告。

這與標準的引用解釋無關。

BB<AA> instance; 

的情況下,因爲你可以做在具有副作用的構造函數的東西,編譯器不會發出警告消息。編譯器選擇不研究如何實現構造函數的細節來推斷調用構造函數是否有副作用。

CC<AA> instance2; 

則能夠推斷出有構造對象的無副作用的情況。

+0

在VS 2017中它實際上是一個錯誤。不是一個警告。而且我絕對沒有打開「將警告視爲錯誤」。還是一個很好的答案。 – TobiMcNamobi 2018-02-08 12:23:47

+0

@TobiMcNamobi,我沒有訪問VS 2017.希望你從另一個來源得到你的答案。 – 2018-02-08 16:52:33