gpt4 book ai didi

c++ - 从自由函数与成员函数返回仅移动类型

转载 作者:太空狗 更新时间:2023-10-29 21:43:16 25 4
gpt4 key购买 nike

我先简单介绍一下实际场景:

我创建了一个名为 error<T> 的类模板其中包含类型 T 和错误相关变量。
构造函数是这样的

error(T&&,..other_params...)   

并且有一个效用函数生成这个定义如下

template<typename T>
make_error(T&& val_T,..other_params..)
{return error<T>(std::forward<T&&>(val_t),..other_params..);}

我使用此类型作为返回类型,而不仅仅是类型 T。基本上它只是用错误信息包装类型。

它有一个 getter,它获取包含的类型的值:

T get()
{ return val_T_int;}

哪里val_T_intval_t 初始化以上。
当我使用移动时,只输入这个 get给出错误提示 delete copy constructor being used .

Q1。为什么这样说?为什么它不移动构造值?即我必须在返回值上显式使用 std::move() 。

Q2。如果 Q1 不可能,那么我将如何启用这样的功能,用户将返回此错误而不是返回类型。我无法使用 boost::optional因为它需要类型为 copy constructible

我的编译器:Windows 7 上的 minGW GCC 4.8.2。

例如:

class B //a move only type
{
B( const B& )=delete;
B& operator=( const B& ) = delete;
public:
B( B&& )
{
std::cout << "B&&\n";
}

B& operator=( B&& )
{
std::cout << "B=\n";
return *this;
}
B(){ std::cout << "B()\n"; }
};

struct error //the other parts are stripped of for simplicity.
{
B get()
{
return std::move(b);
}
private :
B b{};// B is a move only type.
};

error er{};
er.get(); //error:use of deleted function B(const B&)!.

我在这里不明白什么?。感谢阅读。

附言this很接近,但我不明白局部变量的原因。

thisthis也力求帮助

最佳答案

看看下面的代码。如果 get 方法会将 string 移出成员变量,那么 t 的值应该是多少?

error e = make_error(std::string{"foobar"});
std::string s = e.get();
std::string t = e.get();

您可以返回对成员变量的引用。它可能如下所示:

const T& get() const { return val_T_int; }

该解决方案的问题在于,您不能通过以下方式将其与不可复制类型一起使用:

std::unique_ptr<...> result = make_error(...).get();

但是,您可以使用为此使用右值引用 来解决这个问题。如果您按以下方式声明 get,则该函数只能用于 temporaries(以及显式 moved 对象)。所以把成员变量移出对象就好了。

T get() && { return std::move(val_T_int); }

关于c++ - 从自由函数与成员函数返回仅移动类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23324783/

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