В C ++ 11 можно:
std::ifstream source("myfile.dat", std::ios::binary);
std::vector<char> data(std::istreambuf_iterator<char>(source), {});
Эта более короткая форма позволяет избежать самой неприятной проблемы синтаксического анализа из-за аргумента {}
, который устраняет двусмысленность, являющуюся аргументом или формальным параметром.
@ Ответ wilhelmtell также можно обновить, чтобы избежать этой проблемы, приняв инициализатор фигурной скобки для data
. Тем не менее, на мой взгляд, использование {}
более просто и не имеет значения для формы инициализации.
EDIT
Или, если бы у нас было std::lvalue
(и, возможно, std::xvalue
вместо std::move
):
#include <vector>
#include <fstream>
template <typename T>
constexpr T &lvalue(T &&r) noexcept { return r; }
int main() {
using namespace std;
vector<char> data(
istreambuf_iterator<char>(lvalue(ifstream("myfile.dat", ios::binary))),
{}
);
}