gpt4 book ai didi

c++构造函数中可移动类型的右值

转载 作者:太空狗 更新时间:2023-10-29 19:40:52 27 4
gpt4 key购买 nike

我正在使用 C++11 并尝试构建一个拥有这样的可移动类型的类:

class foo {
std::istream input;

public:
foo(std::istream && in): input(in) { }
};

然后实例化对象:

foo var1(std::ifstream("/tmp/something"));

但是编译器总是提示我调用了一个删除的构造函数。这可能吗?

clang++ -stdlib=libc++ -std=c++0x foo.cpp 
foo.cpp:7:30: error: call to deleted constructor of 'std::istream' (aka 'basic_istream<char>')
foo(std::istream && in): input(in) { }
^ ~~
/usr/bin/../lib/c++/v1/istream:1740:23: note: function has been explicitly marked deleted here
extern template class basic_istream<char>;
^
1 error generated.

最佳答案

不幸的是,您不能复制(甚至移动)抽象流类型 std::istream。您可以通过引用保存它们,但这似乎不是您的代码想要做的。

当您传入 std::ifstream 时,我假设这是您真正想要处理的流类型。与 std::istream 不同,std::ifstream 是具体类型。这种类型是可移动的,但不可复制。

hmjd 的答案,并且您标记为正确,是编写此代码的最佳方式:

#include <fstream>

class foo
{
std::ifstream input;
public:
foo(std::ifstream&& in): input(std::move(in)) { }
};

说明:foo 构造函数将只接受右值 std::ifstream,这是正确的。但是一旦你进入这个构造函数,变量 in 就不再是一个右值(它是一个左值)。因此,您需要将其转换回右值(使用 std::move)以移动构造数据成员 input

这与您将用于任何仅移动类型的模式相同(stringstreamunique_ptrfutureunique_lock 等)。

关于c++构造函数中可移动类型的右值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8590145/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com