gpt4 book ai didi

c++ - 从不可 move 对象的函数返回拷贝

转载 作者:搜寻专家 更新时间:2023-10-31 01:43:36 24 4
gpt4 key购买 nike

我的一个 friend 偶然发现了一个问题

有什么方法可以返回可复制但不可 move 的对象拷贝。换句话说,我们能让下面的代码工作吗?

struct A {
A() = default;
A(A const&) = default; // copyable
A& operator=(A const&) = default; // assignable
A(A &&) = delete; // not movable
A& operator=(A &&) = delete; // not movable
~A() = default;
};

A foo() {
A a;
return a;
}

int main() {
A a(foo()); //will fail, because it calls A(A&&)
return 0;
}

在我看来,我们不能,因为 foo() 是一个 A&& 然后编译器必须调用 A(A&&)。但我想要某种确认。

最佳答案

根据 dyp 发表评论中的代码; Is there a cast (or standard function) with the opposite effect to std::move ? , 以下代码片段编译。

我不确定代码的用处,在 linked post 中有一些关于这是否是个好主意的讨论。 .

struct A {
A() = default;
A(A const&) = default; // copyable
A& operator=(A const&) = default; // assignable
A(A &&) = delete; // not movable
A& operator=(A &&) = delete; // not movable
~A() = default;
};

template <typename T>
T& as_lvalue_ref(T&& t) {
return t;
}

A foo() {
A a;
return as_lvalue_ref(a);
}

int main() {
A a(as_lvalue_ref(foo()));
return 0;
}

代码示例 here .

A static_cast<T&>()也可以代替 as_lvalue_ref()甚至可能更可取(尽管看起来笨拙),因为它实际上很冗长。在返回引用的任何情况下,都可能发生悬挂引用。给定签名 A foo()在这种情况下(而不是说 A& foo() ),这里没有悬挂引用,一个完整的对象 A回。线路A a(as_lvalue(foo()));自从 as_lvalue_ref(foo()) 返回的临时(纯右值)以来,也没有悬挂引用在表达式 ( ; ) 结束之前保持有效,然后是 a对象将是格式正确的。

关于c++ - 从不可 move 对象的函数返回拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24896176/

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