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

Oca*_*shu 7 c++ compiler-errors ifstream

我知道以下代码(从这里)用于将文件的内容读取到字符串:

#include <fstream>
#include <string>

  std::ifstream ifs("myfile.txt");
  std::string content( (std::istreambuf_iterator<char>(ifs) ),
                       (std::istreambuf_iterator<char>()    ) );
Run Code Online (Sandbox Code Playgroud)

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

#include <fstream>
#include <string>

  std::ifstream ifs("myfile.txt");
  std::string content(std::istreambuf_iterator<char>(ifs),
                      std::istreambuf_iterator<char>()    );
Run Code Online (Sandbox Code Playgroud)

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

Set*_*gie 12

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

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

std::string content { std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>() };
Run Code Online (Sandbox Code Playgroud)

或者正如Loki提到的:

std::string content = std::string(std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>());
Run Code Online (Sandbox Code Playgroud)

  • 注意:在C++ 11中,你可以做`std :: string content {std :: istreambuf_iterator <char>(ifs),std :: istreambuf_iterator <char>()};` (3认同)
  • 或者你可以使用:`std :: string content = std :: string(std :: istreambuf_iterator <char>(ifs),std :: istreambuf_iterator <char>());` (3认同)