2017-04-04 41 views
10

answer有以下代碼:定義裏面fstream的一個「如果」有條件

if (std::ifstream input("input_file.txt")) 
    ; 

這似乎方便,限制了「輸入」變量到它的確認範圍是有效的,但是沒有VS2015和g ++似乎編譯它。它是一些編譯器特定的東西,還是它需要一些額外的標誌?

在VS2015中,IDE突出顯示了「std :: ifstream」和「input_file.txt」以及最後一個括號。 「std :: ifstream」被標記爲「錯誤:函數類型不允許在這裏」。

VS2015 C++編譯器提供了以下錯誤:

  • C4430缺少類型說明符 - 假定爲int。注意:C++不支持默認int
  • C2059語法錯誤: '('

回答

13

你是不合法的代碼..但在此之前C++ 11 if語句可能是

if(condition) 
if(type name = initializer) 

name和將作爲bool進行評估,以確定所述條件,在C++14分之11消耗以允許規則

if(condition) 
if(type name = initializer) 
if(type name{initializer}) 

其中,再次,在初始化以確定條件後,將其評估爲bool

從C++ 17開始,儘管您可以在if語句中聲明一個變量,如同for循環的複合語句,它允許您用圓括號初始化該變量。

if (std::ifstream input("input_file.txt"); input.is_open()) 
{ 
    // do stuff with input 
} 
else 
{ 
    // do other stuff with input 
} 

應該指出,雖然,這只是語法糖和上面的代碼實際上被翻譯成

{ 
    std::ifstream input("input_file.txt") 
    if (input.is_open()) 
    { 
     // do stuff with input 
    } 
    else 
    { 
     // do other stuff with input 
    } 
} 
+1

你*可以* *在*條件中聲明一個變量*一直返回到C++ 03。只是初始化的形式是有限的。 –

+0

@FredLarson Answr更新。我錯了。回到C++ 98/03,你可以聲明一個變量。 – NathanOliver

+0

@NathanOliver它不會限制'input'的範圍嗎?還是僅僅是糖? – user3358771

8

根據http://en.cppreference.com/w/cpp/language/if代碼是不合法的(這個網站是非常著名的,但我可以如果需要尋找標準參考)。您可以在if條件中聲明變量,但它們必須通過={}進行初始化。因此,假設你至少有C++ 11,你可以這樣做:

if (std::ifstream input{"input_file.txt"}) 
    ; 
+2

OP的代碼在C++ 17中仍然不合法。新的* init-statement *功能不會更改* condition *所需的形式。 –

+0

@ T.C。刪除了「(還)」音符 - 謝謝。 –