Почему лишние скобки в функции чтения файлов?

Я так понимаю, что следующий код (отсюда) используется для чтения содержимого файла в строку:

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

Почему для компиляции нужно так много скобок?

7

Решение

Потому что без скобок компилятор обрабатывает его как объявление функции, объявляя функцию с именем 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>());
12

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]