首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制只移动语义

强制只移动语义
EN

Stack Overflow用户
提问于 2018-04-13 10:04:55
回答 1查看 63关注 0票数 0

虽然我使用以前的版本已经很多年了,但我对C++11相对来说还是比较新的。这是强制一个物体只能移动的正确方式吗?

代码语言:javascript
复制
class CResource
{
public:
    CResource();

    CResource(CResource &&);
    CResource & operator=(CResource &&);

private:
    CResource(const CResource &) = delete;
    CResource & operator=(const CResource &) = delete;

    void * m_pResource;
};

class CAcquireResource
{
public:
    CResource && AcquireResource();
};

CResource && CAcquireResource::AcquireResource()
{
    CResource res;
    return std::move(res);
}

编辑后的评论来自塞巴斯蒂安雷德尔和underscore_d

代码语言:javascript
复制
class CResource
{
public:
    CResource();
    CResource(CResource &&);
    CResource & operator=(CResource &&);
};

class CAcquireResource
{
public:
    CResource AcquireResource();
};

CResource CAcquireResource::AcquireResource()
{
    CResource res;
    return std::move(res);
}

断言也同样站得住脚..。

代码语言:javascript
复制
#include <type_traits>
#define STR_NAME(s) #s
#define STATIC_ASSERT_NOCOPYASSIGN(clazz)                                   \
    static_assert(!std::is_copy_assignable<clazz>::value,                   \
        STR_NAME(clazz) " is_copy_assignable");

#define STATIC_ASSERT_NOCOPYCONSTRUCT(clazz)                                \
    static_assert(!std::is_copy_constructible<clazz>::value,                \
        STR_NAME(clazz) " is_copy_constructible");

#define STATIC_ASSERT_MOVEASSIGN(clazz)                                     \
    static_assert(std::is_move_assignable<clazz>::value,                    \
        STR_NAME(clazz) " !is_move_assignable");

#define STATIC_ASSERT_MOVECONSTRUCT(clazz)                                  \
    static_assert(std::is_move_constructible<clazz>::value,                 \
        STR_NAME(clazz) " !is_move_constructible");

#define STATIC_ASSERT_REFERENCECLASS(clazz)                                 \
    STATIC_ASSERT_MOVEASSIGN(clazz)                                         \
    STATIC_ASSERT_MOVECONSTRUCT(clazz)                                      \
    STATIC_ASSERT_NOCOPYASSIGN(clazz)                                       \
    STATIC_ASSERT_NOCOPYCONSTRUCT(clazz)    

STATIC_ASSERT_REFERENCECLASS(CResource);

这些都通过了2017。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-13 10:28:36

你的方法只允许移动。

然而,移动构造函数/赋值操作符的存在已经抑制了复制构造函数和赋值操作符的生成;不需要显式删除。在C++11草案的早期,只有少数编译器没有正确地实现这个部分。

但是,请注意,AcquireResource代码返回对局部变量的引用,因此具有未定义的行为。你应该按价值返回。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49814404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档