在创建对象时理解{...}的含义

时间:2015-03-03 17:38:22

标签: c++ c++11

我遇到了以下代码

#include <iterator>
#include <string>
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>

int main() {

    std::string inputfilename, outputfilename;

    std::cin  >> outputfilename;

    std::ofstream outputfile{ outputfilename };

    outputfile << "I exist Yo!";

    return 0;
}

我的第一反应是它不应该编译。我从未见过outputfile{ outputfilename };语法。有人可以告诉我C ++语言的哪些特性在这行代码中定义了{...}的行为?

P.S。代码可以运行并完成您期望的工作。

1 个答案:

答案 0 :(得分:8)

从C ++ 11标准(强调我的):

  

8.5.4列表初始化[dcl.init.list]

     

1 列表初始化是从 braced-init-list 初始化对象或引用。这样的初始化程序称为初始化程序列表,列表中逗号分隔的 initializer-clauses 称为初始化程序列表的元素。初始化列表可以为空。 列表初始化可以在直接初始化复制初始化上下文中进行; 直接初始化上下文中的 list-initialization 称为 direct-list-initialization list-initialization 复制初始化上下文称为复制列表初始化。 [注意:列表初始化可以使用

     
      
  • 作为变量定义中的初始化程序(8.5)
  •   
  • 作为新表达式(5.3.4)
  • 中的初始值设定项   
  • 在退货声明(6.6.3)
  • 中   
  • 作为函数参数(5.2.2)
  •   
  • 作为下标(5.2.1)
  •   
  • 作为构造函数调用的参数(8.5,5.2.3)
  •   
  • [..]
  •