我理解以下代码(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>() );
为什么编译需要这么多括号?
答案 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>());