7

我了解以下代码(来自此处)用于将文件的内容读取为字符串:

#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>()    );

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

4

1 回答 1

12

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

您可以使用括号,或者正如 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>());
于 2012-09-25T19:51:03.517 回答