gpt4 book ai didi

c++ - 为什么右值引用成员会是 const?

转载 作者:行者123 更新时间:2023-12-04 14:43:35 26 4
gpt4 key购买 nike

我正在尝试为结构编写移动构造函数,但我不明白为什么我无法调用结构成员的移动构造函数:

#include <memory>

struct C
{
std::unique_ptr<int[]> mVector;
size_t mSize;

C() = default;

C(C &&temp)
: mVector(temp.mVector)
, mSize(temp.mSize)
{}
};

当我编译这个时,我得到:

gcc -c TempTest.cpp
TempTest.cpp: In constructor 'C::C(C&&)':
TempTest.cpp:9:23: error: use of deleted function 'std::unique_ptr<_Tp [], _Dp>::unique_ptr(const std::unique_ptr<_Tp [], _Dp>&) [with _Tp = int; _Dp = std::default_delete<int []>]'
9 | , mSize(temp.mSize)
| ^
In file included from c:/msys64/mingw64/include/c++/10.3.0/memory:83,
from TempTest.cpp:1:
c:/msys64/mingw64/include/c++/10.3.0/bits/unique_ptr.h:723:7: note: declared here
723 | unique_ptr(const unique_ptr&) = delete;
| ^~~~~~~~~~

因为在构造函数中 temp 是一个右值引用,它是非常量的,所以 temp.mVector 应该是非常量并且应该调用 unique_ptr移动构造函数,而是调用被删除的复制构造函数。知道错误在哪里吗?

最佳答案

Why rvalue reference member would be const?

不要假设它是 const。您应该假设 unique_ptr(const unique_ptr&) 只是可用构造函数中的最佳匹配

Because in constructor temp is a rvalue reference

惊喜!它不是右值引用。

当调用构造函数时,变量temp 绑定(bind) 到一个右值。现在它是一个命名变量,它不再是一个“临时”。它已成为一个左值。

由于您知道在调用构造函数时值右值,因此您可以安全地移动成员,将它们转换回右值。

C(C &&temp)
: mVector(std::move(temp.mVector))
// ^^^^^^^^^ We know that temp CAME FROM an r-value,
// so it can safely be moved.
, mSize(temp.mSize)
{}

关于c++ - 为什么右值引用成员会是 const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69429111/

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