c++ - 移动构造函数应该采用 const 还是非 const 右值引用?

标签 c++ c++11 rvalue-reference move-constructor

在几个地方,我看到推荐的复制和移动构造函数签名如下:

struct T
{
    T();
    T(const T& other);
    T(T&& other);
};

复制构造函数采用 const 引用,而移动构造函数采用非 const 右值引用。

据我所知,这阻止了我在从函数返回 const 对象时利用移动语义,例如以下情况:

T generate_t()
{
    const T t;
    return t;
}

使用 VC11 Beta 进行测试,调用的是 T 的复制构造函数,而不是移动构造函数。即使使用 return std::move(t); 仍然会调用复制构造函数。

我明白这是怎么回事,因为 t 是 const 所以不应该绑定(bind)到 T&&。在移动构造函数签名中使用 const T&& 可以正常工作,并且有意义,但是您会遇到问题,因为 other 是 const,如果如果它们需要被清空 - 只有当所有成员都是标量或具有正确签名的移动构造函数时才会起作用。

这似乎是确保在一般情况下调用移动构造函数以首先使 t 非 const 的唯一方法,但我不喜欢这样做 - consting things 是好的形式,我不希望 T 的客户知道他们必须违背该形式才能提高性能。

所以,我想我的问题是双重的;首先,移动构造函数应该采用 const 还是非 const 右值引用?第二:我的推理是否正确?我应该停止返回 const 的东西吗?

最佳答案

它应该是一个非const 右值引用。

如果一个对象被放置在只读内存中,你就不能从中窃取资源,即使它的正式生命周期即将结束。在 C++ 中创建为 const 的对象可以存在于只读内存中(使用 const_cast 尝试更改它们会导致未定义的行为)。

关于c++ - 移动构造函数应该采用 const 还是非 const 右值引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10770181/

相关文章:

c++ - Windows应用程序因纯虚函数调用而崩溃

c++ - 有没有办法在 MFC 应用程序中获取控件映射到的处理函数?

c++ - 确定正确的 protobuf 类

c++ - 这是无限递归UB吗?

c++ - 按值返回的右值引用参数是 xvalue 吗?

c++ - 对数据类型使用 #define 和 typedef 是一个好的做法吗?

c++ - Arduino Nano 33 物联网软件序列号

algorithm - 如何生成仅包含 2 种数字的第 n 个数字?

c++ - 令人困惑的 C++ 模板

c++ - 从 arma::subvec 类型的右值初始化类型的非常量引用无效