2016-03-30 83 views
5

您可以使用=初始化一個變量。例如:用=初始化和用{}初始化有什麼區別?

int a = 1000; 

C++ 11引入了額外的記法{}。例如:

int a {1000}; 

根據編程:原理與實踐由Bjarne Stroustrup的:

C++ 11引入的初始化表示法不法分子縮小轉換。

我想看看這個很酷的功能。而我輸入一段代碼兩次:

#include "std_lib_facilities.h"  |  #include "std_lib_facilities.h" 
            | 
int main()       |  int main() 
            | 
{         |  { 
    int x = 254;     |   int x {254}; 
    char y = x;      |   char y {x}; 
    int z = y;      |   int z {y}; 
            | 
    cout << "x = " << x << '\n'  |   cout << "x = " << x << '\n' 
     << "y = " << y << '\n'  |    << "y = " << y << '\n' 
     << "z = " << z << '\n'; |    << "z = " << z << '\n'; 
            | 
}         |  } 

左側的代碼使用=而右邊使用{}代碼

但是,即使使用後在右側的代碼失去了一些信息{}。因此,該輸出是代碼兩件相同:

X = 254

Y =■

Z = -2

那麼,什麼是與=初始化之間的差並用{}初始化?

編輯:我的問題可能是也可能不是重複。我只是一個初學者,我甚至不理解可能原始問題的代碼。我不是法官。即使它是重複的,我也無法理解這個問題的任何答案。我覺得這個問題應該被視爲一個原創的問題,因爲我會理解與該問題答案的某些高級詞語相反的簡單語言。

+0

您確切地認爲,在正確的例子中,「縮小轉換」會失敗嗎?在你的機器上初始化'char'的正數大於'CHAR_MAX'? – DevSolar

+1

'char'(在你的系統中)默認爲'signed char'(但注意'signed char'!='char')。 '254'是一個有效的'char'(沒有縮小轉換,它的數值無關緊要),但是轉換回爲int,由於符號的原因你會得到它。要查看發生了什麼變化,請嘗試'unsigned char k = {260};'vs'unsigned char k = 260;' –

+0

如果使用'gcc'添加'-Werror = narrowing'命令行選項來取消縮小轉換。 –

回答

7

初始化與=和初始化與{}有什麼區別?

一般來說,所不同的是,前者是copy initialization,後者是direct - list initialization。鏈接的在線參考詳細描述了所有三種形式的初始化。尤其是,你已經引用了這個區別。列表初始化可能不適用於縮小轉換。

但是,即使使用{}

程序右側後在右側的代碼失去了一些信息是非法的構造。

如前所述,該標準不允許在列表初始化的上下文中縮小conversionsintchar是一個縮小的轉換。

由於程序格式不正確,除了需要編譯器發出診斷消息外,標準不保證其行爲。例如,G ++ - 5.3.0會說:

warning: narrowing conversion of 'x' from 'int' to 'char' inside { } [-Wnarrowing] 

願你請的 「病態的」 部分詳細點嗎?

標準表示程序不應該執行X.你的程序執行X.因此它違反了使程序不合格的標準。這裏,X是:

如果需要縮小轉換(見下文)來轉換任何參數,則該程序是格式不正確的。


左邊的程序是不是生病形成。然而,就像右邊的程序一樣,它確實爲char y賦值了char類型所不能表示的值(在某些實現中,char是一個無符號類型,但在給定輸出的情況下,是你的實現情況)。將不可表示的值轉換爲帶符號的類型時,結果值是實現定義的。

+0

是的,我得到了這個警告信息!請您詳細說明「不健全」的部分?儘管謝謝你的回答! – Superex

+0

@Superex我添加了一個不合格的簡單解釋。 – user2079303

+0

感謝您對該部分的闡述。但是我已經使用了本書建議的庫(std_lib_facilities.h)。所以我懷疑這個計劃可能是不合格的。 – Superex

相關問題