在'if'条件中定义fstream

时间:2017-04-04 19:00:23

标签: c++ if-statement fstream ifstream ofstream

answer中有以下代码:

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

这似乎很方便,将'input'变量的范围限制在确认有效的位置,但VS2015和g ++似乎都没有编译它。它是某些编译器特定的东西还是需要一些额外的标志?

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

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

  • C4430缺少类型说明符 - 假设为int。注意:C ++不支持default-int
  • C2059语法错误:'('

2 个答案:

答案 0 :(得分:14)

您拥有的代码尚不合法..在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再次被评估为if (std::ifstream input("input_file.txt"); input.is_open()) { // do stuff with input } else { // do other stuff with input }

从C ++ 17开始,虽然您可以将if语句中的变量声明为复合语句,如for循环,它允许您使用括号初始化变量。

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

应该注意的是,这只是语法糖,上面的代码实际上已翻译成

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-apps://itunes.apple.com/gb/app/id1136613532?action=write-review&mt=8"]];

答案 1 :(得分:8)

根据http://en.cppreference.com/w/cpp/language/if代码不合法​​(此网站非常有信誉,但如果需要,我可以寻找标准参考)。您可以在if条件中声明变量,但必须由func scrollViewDidScroll(_ scrollView: UIScrollView) { let offset = scrollView.contentOffset.y if(offset > 50){ self.myView.frame = CGRect(x: 0, y: offset - 50, width: self.view.bounds.size.width, height: 100) }else{ self.myView.frame = CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: 100) } } =初始化。所以假设你至少拥有C ++ 11,你可以这样做:

{}