2017-10-16 14 views
2

나는 잠시 동안 답변을 찾아 보았지만 찾지 못했습니다. 그래서 여기서 구체적으로 질문을하기로했습니다.반원 내에서 이동 평행선

struct NonCopyable 
{ 
    NonCopyable() { }; 
    NonCopyable(const NonCopyable& other) = delete; 
    NonCopyable(NonCopyable&& other) { }; 
}; 

struct Host 
{ 
    Host(NonCopyable&& nc) : m_nc(nc) { } 
    NonCopyable m_nc; 
}; 

이 달성하기 위해 : 나는 이런 식으로 뭔가를 사용하려고 (본 문서의 변형) 봤는데

Host h(NonCopyable()); 

을, 나는 내 NonCopyable 구축하고 싶습니다 m_nc. 가능한가요?

+0

만약'm_nc' 안에'NonCopyable'을 만들고 싶다면'm_nc' 내부에서 생성하는 것이 아니라 왜 매개 변수로 전달할 것인가 ...?) – user463035818

+0

나는 그것을 주입하고 싶습니다. 외부. 당신은 내가 생성자의 매개 변수를 전달하고 호스트 내부에서 구성해야한다는 것을 의미합니까? '호스트 () : m_nc ()? – racanu

+0

[메서드 정의 후 세미콜론] (https://stackoverflow.com/a/5365656/211160)에 대한 몇 가지 참고 사항이 있습니다. – HostileFork

답변

4

nc은 명명 된 매개 변수의 좌변 값이므로이 값을 rvalue로 변환해야합니다. std::move

Host(NonCopyable&& nc) : m_nc(std::move(nc)) { } 

편집

를 통해 most vexing parse 문제가있다. Host h(NonCopyable());은 변수 정의가 아니라 함수 선언입니다. 이 함수는 h이라는 함수를 선언합니다.이 함수는 Host을 반환하며 함수 포인터 유형이없는 익명 매개 변수를 사용합니다 (아무 것도 걸리지 않고 NonCopyable을 반환 함).

Host h{NonCopyable()};으로 변경하십시오.

+0

예, 시도해 보았습니다. 대답에 영향을 미치지 않도록 게시하고 싶지 않았습니다. – racanu

+1

@racanu 시도해 보니 문제가 뭐니? 불가능하다고 생각하는 이유는 무엇입니까? – songyuanyao

+0

나는 std :: move로조차도 그것을 원한다는 것처럼 작동하지 않는다는 것을 의미한다. 그것은 컴파일하지만 경고 메시지가 나타납니다 : 경고 '호스트 h (NonCopyable (__cdecl *) (void))': 프로토 타이핑 된 함수가 호출되지 않았습니다 (변수 정의가 의도 되었습니까?) ' 코드가 생성되지 않았습니다. 인스턴스화 행 – racanu