【问题标题】:Defining fstream inside a 'if' conditional在“if”条件内定义 fstream
【发布时间】:2017-08-30 03:26:46
【问题描述】:

answer 中有以下代码:

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

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

在 VS2015 中,IDE 突出显示“std::ifstream”和“input_file.txt”以及最后的括号。 "std::ifstream" 被标记为 "Error: a function type is not allowed here"。

VS2015 C++ 编译器报以下错误:

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

【问题讨论】:

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


    【解决方案1】:

    您拥有的代码是不合法的.. 尚未。在 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 开始,您可以在 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
        }
    }
    

    【讨论】:

    • 可以在一个条件中声明一个变量,一路回到C++03。只是初始化的形式有限。
    • @FredLarson Answr 已更新。我确实错了。回到 C++98/03,你可以声明一个变量。
    • @NathanOliver 不是也限制了input的范围吗?还是只是糖?
    • @NathanOliver:更新已记录,回答已投票,评论已删除。
    • @user3358771 所有版本都限制范围。
    【解决方案2】:

    根据http://en.cppreference.com/w/cpp/language/if 的说法,该代码不合法​​(这个网站很有名,但如果需要,我可以寻找标准参考)。您可以在 if 条件中声明变量,但它们必须由 ={} 初始化。所以假设你至少有 C++11,你可以这样做:

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

    【讨论】:

    • OP 的代码在 C++17 中仍然不合法。新的 init-statement 功能不会更改所需的 condition 形式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多