在“if”条件语句内定义fstream

11

在一个答案中,有以下代码:

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

这似乎很方便,将“input”变量的范围限制在确认其有效性的位置,但是VS2015和g ++都似乎无法编译它。这是某种编译器特定问题还是需要一些额外的标志?

在VS2015中,IDE突出显示“std :: ifstream”和“input_file.txt”,以及最后一个括号。 “std :: ifstream”用“错误:此处不允许函数类型”标记。

VS2015 C++编译器会给出以下错误:

  • C4430缺少类型说明符-假定为int。注意:C ++不支持默认int
  • C2059语法错误:'('
2个回答

15

你目前的代码是不合法的......但是。在C++11之前,if语句可以

if(condition)
if(type name = initializer)

并且 name 将被评估为一个 bool 来确定条件。在 C++11/14 中,规则被扩展以允许

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

再次强调,name在初始化后会被评估为一个bool以确定条件。

从C++17开始,你将能够像for循环一样在if语句中声明一个变量作为复合语句,这允许你使用括号初始化变量。

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中的条件语句中声明变量,只是初始化的形式受到限制。 - T.C.
@FredLarson 答案已更新。我之前理解有误。在C++98/03中,你可以声明一个变量。 - NathanOliver
@NathanOliver 这不也限制了 input 的范围吗?还是说这只是语法糖? - user3358771
@NathanOliver:已经注意到更新,回答已点赞,评论已删除。 - Fred Larson
@user3358771 所有版本都限制了范围。 - NathanOliver
显示剩余6条评论

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所需的形式。 - T.C.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接