Я так понимаю, что следующий код (отсюда) используется для чтения содержимого файла в строку:
#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>() );
Почему для компиляции нужно так много скобок?
Потому что без скобок компилятор обрабатывает его как объявление функции, объявляя функцию с именем content
который возвращает std::string
и принимает в качестве аргументов std::istreambuf_iterator<char>
названный ifs
и безымянный параметр, который является функцией без аргументов, которая возвращает std::istreambuf_iterator<char>
,
Вы можете жить с паренами или, как отмечает Александр в комментариях, вы можете использовать универсальную функцию инициализации C ++, которая не имеет таких двусмысленностей:
std::string content { std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>() };
Или, как упоминает Локи:
std::string content = std::string(std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>());
Других решений пока нет …