2017-06-29 20 views
4

我想編譯一些相當簡單的C++代碼與GCC 6,但得到縮小轉換警告。這是有問題的,因爲我們將警告視爲錯誤。gcc縮小轉換+運算符

struct S { 
    short int a; 
    short int b; 
}; 

short int getFoo(); 
short int getBar(); 

std::array<S, 2> arr = {{ 
    {5, getFoo()}, 
    {3, getFoo() + getBar()} // Narrowing conversion here? 
}}; 

您可以看到此代碼在行動https://godbolt.org/g/wHNxoc。 GCC表示getFoo()+ getBar()從int縮小爲short int。什麼導致了向int的上傳?這裏有什麼好的解決方案嗎?

+2

http://en.cppreference.com/w/cpp/language/implicit_conversion –

回答

8

這是由於integral promotion:小積分類型(如炭)的

prvalues可被轉換成較大的整數類型的 prvalues(如int)。特別是, 算術運算符不接受類型小於 參數,並且積分促銷自動應用 左值到右值轉換(如果適用)。此轉換始終保留該值。

因此,getFoo() + getBar()有一個類型的INT,從而導致上述警告。

爲了抑制警告,你可能會利用的static_cast的:

static_cast<short>(getFoo() + getBar())