2013-03-20 86 views
3
#include <iostream> 
using namespace std; 

struct test 
{ 
    int factorX; 
    double coefficient; 
}; 

int main() 
{ 
    test firstTest = {1, 7.5}; //that's ok 

    test *secondTest = new test; 
    *secondTest = {8, 55.2}; // issue a compiler warning 

} 

我不明白爲什麼編譯器會發出如下警告:初始化指針結構 - 編譯器警告

test2.cpp:13:33: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default] 
test2.cpp:13:33: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default] 

我知道,在C++ 11我可以省略賦值運算符,但是這不是案子。 我正在使用g ++ 4.7.2。

回答

5

您的test結構是一個聚合。雖然在C++ 98中支持使用大括號語法的aggregate的初始化,但是賦值不是。

這裏,真正發生的是,編譯器調用隱式生成的移動賦值運算符,它以test&&作爲輸入。爲了使這個調用合法,編譯器必須通過構造一個臨時對象,將{8, 55.2}轉換爲test的實例,然後將此臨時對象分配給*secondTest

此行爲僅在C++ 11中受支持,這就是編譯器告訴您必須使用-std=c++11選項進行編譯的原因。

+0

@Toshko:很高興幫助:) – 2013-03-20 13:08:14

2

由於第一次是初始化,第二次是分配。您可以在C++ 98中以這種方式初始化簡單結構,但不能分配。

8.5.1/1

聚集是沒有用戶聲明的構造(12.1),無私人或促 tected非靜態數據成員的陣列或一個類(第9節)(第11條),沒有基類(第10章),也沒有虛函數(10.3)。

8.5.1/2

當集合被初始化初始化可以包含由brace- 封閉,逗號分隔的初始化子句的列表的用於聚集體的成員的初始化子句,以增加 下標或成員順序撰寫。

但是第二構造調用類的operator =,因爲你沒有用戶定義的複製的c-TOR,默認複製的c-TOR將被調用,在C++ 11與表達在{}可以構造對象的需要鍵入,但不在C++ 98中。

1

錯誤信息告訴你你需要做什麼,編譯程序時需要在命令行中添加-std=c++11-std=gnu++11。這是一個C++ 11的功能,你必須啓用它:

test2.cpp:13:33: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default] 
                      ^^^^^^^^^  ^^^^^^^^^^^ 

正如安迪說這是一個C++ 11功能,它是由{8, 55.2}創建的臨時使用隱式生成的移動功能,這是你在第二種情況下所擁有的。

+0

是的,我知道這一點。但是這兩種初始化有什麼區別?沒有「secondTest」,編譯器不要求我使用-std = C++ 11標誌,我不明白爲什麼。 – Toshko 2013-03-20 12:59:17

+1

@Toshko:區別在於第二個不是初始化:這是一個任務 – 2013-03-20 13:02:27