为什么文件读取功能中有额外的括号?

时间:2012-09-25 19:49:10

标签: c++ compiler-errors ifstream

我理解以下代码(from here)用于将文件内容读取为字符串:

#include <fstream>
#include <string>

  std::ifstream ifs("myfile.txt");
  std::string content( (std::istreambuf_iterator<char>(ifs) ),
                       (std::istreambuf_iterator<char>()    ) );

但是,我不明白为什么需要这些看似多余的括号。例如,以下代码无法编译:

#include <fstream>
#include <string>

  std::ifstream ifs("myfile.txt");
  std::string content(std::istreambuf_iterator<char>(ifs),
                      std::istreambuf_iterator<char>()    );

为什么编译需要这么多括号?

1 个答案:

答案 0 :(得分:12)

因为没有括号,编译器会将其视为函数声明,声明名为content的函数返回std::string并将std::istreambuf_iterator<char>作为参数作为ifs和一个无名参数,它是一个不带参数的函数,返回std::istreambuf_iterator<char>

你可以和parens一起生活,或者正如Alexandre在评论中指出的那样,你可以使用C ++的统一初始化功能,它没有这样的含糊之处:

std::string content { std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>() };

或者正如Loki所提到的那样:

std::string content = std::string(std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>());