考虑以下:
#include <fstream>
#include <tuple>
#include <utility>
#include <vector>
const auto length_of_file = [](auto & file){
file.seekg(0, std::ios::end);
std::streampos length = file.tellg();
file.seekg(0, std::ios::beg);
return length;
};
int main(int, char * []) {
const auto check_and_read = [](const auto & filename){
std::ifstream file(filename, std::ios::binary);
file.exceptions(std::ios::failbit | std::ios::badbit);
std::vector<std::byte> data(length_of_file(file));
file.read(reinterpret_cast<char*>(data.data()), data.size());
return std::make_tuple(file, data);
};
auto [file, data] = check_and_read("foo.txt");
}
Run Code Online (Sandbox Code Playgroud)
由于无法复制file
,因此无法编译。
return std::make_tuple(std::move(file), data);
可以,但是我问自己“这是否意味着它正在复制而不是data
现在移动?”,所以我宁愿有一个通用的解决方案。
但是两者都没有(至少在这里期望移动语义/复制省略):
const auto check_and_read = [](const auto & filename)
-> …
Run Code Online (Sandbox Code Playgroud) c++ ×1