gpt4 book ai didi

c++ - 从 const 引用 move 构造

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:57:55 25 4
gpt4 key购买 nike

我有以下情况需要从 t1 move 构造 t2。不幸的是,这是不可能的(我想是违反常量的)
从 foo 的调用者透明地处理该问题的正确方法是什么? (即不需要按值传递和显式 std::move)

struct T
{
T() = default;
~T() = default;
T(T&&) = default;
};

T foo(const T& t)
{
T t3;

if (predicate)
return t3;
else
return std::move(t);
}

int main()
{
T t1;
T t2 = foo(t1);

return 0;
}

最佳答案

What is the right approach to handle that transparently from the caller of foo ?

你不能那样做,而这是有意为之的。永远不会透明地 move 左值。

由于移出的对象通常处于未知(但合法)状态,如果客户端可以将左值作为参数传递给函数,并且允许该函数悄悄地从它移出,那将是危险的。客户端可能会在不知不觉中留下一个僵尸对象!

因此,该语言强制执行从左值 move 必须是有意识的行为的规则,并且应该通过调用 std::move( )

在这种情况下,我会说你的函数 foo() - 无论它实际上应该做什么 - 应该采用右值引用,并且客户端应该像这样调用它:

T t2 = foo(std::move(t1)); 

请注意,一旦您将无意义的名称(例如 foo())变成反射(reflect)某些具体程序中某些特定操作的语义的名称,最后的建议可能就不正确了。但是,在不知道该操作的含义的情况下,我只能就如何编译您的代码片段以及如何考虑一般的 move 语义提供正式的、机械的建议。

关于c++ - 从 const 引用 move 构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16745275/

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