小编Dar*_*ter的帖子

返回不可复制对象的元组

考虑以下:

#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++

10
推荐指数
2
解决办法
618
查看次数

标签 统计

c++ ×1