>

수년 동안 이전 버전을 사용해 왔지만 C ++ 11을 처음 접했습니다. 이것이 물체 만 움직일 수 있도록하는 올바른 방법입니까?

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);
}

Sebastian Redl과 underscore_d의 의견에 따라 편집 됨

class CResource
{
public:
    CResource();
    CResource(CResource &&);
    CResource & operator=(CResource &&);
};
class CAcquireResource
{
public:
    CResource AcquireResource();
};
CResource CAcquireResource::AcquireResource()
{
    CResource res;
    return std::move(res);
}

어설 션도 잘 견뎌내고 있습니다 ...

#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);

이것은 Visual Studio 2017과 함께 제공됩니다.

  • 답변 # 1

    이 방법은 이동 전용을 시행합니다.

    그러나 이동 생성자/할당 연산자의 존재는 이미 복사 생성자 및 할당 연산자의 생성을 억제합니다. 명시적인 삭제는 필요하지 않습니다. C ++ 11 초안 초창기에는 소수의 컴파일러 만이 부분을 제대로 구현하지 못했습니다.

    그러나 pyzwyz  코드는 지역 변수에 대한 참조를 반환하므로 정의되지 않은 동작이 있습니다. 값으로 돌아와야합니다.

    AcquireResource

  • 이전 파이썬 여러 줄 문자열에서 변수 무시
  • 다음 python - 각 인스턴스에 대해 별도의 가입 된 비즈니스 이름, 휴대폰, 도시 및 이메일