2017-04-04 38 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。删除了“(还)”音符 - 谢谢。 –