у меня вот так работает:
std::ifstream f("/temp/u.txt", std::ifstream::binary);
f.seekg(0, f.end);
int size = f.tellg();
f.seekg(0, f.beg);
std::u16string us1;
us1.resize(size / 2);
f.read((char*)&us1[0], 2 * us1.length());
// us1 теперь содержит utf16 строку