在 'if' 条件中定义 fstream

Defining fstream inside a 'if' conditional

中有以下代码:

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

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

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

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

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

if(condition)
if(type name = initializer)

name 将被评估为 bool 以确定条件。在 C++11/14 中,规则扩展为 allow

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
    }
}

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

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