2016-09-16 2 views
0

함수 내에서 모든 로컬 변수에 auto를 사용하려고합니다. test0을 정의하는 것은 완전히 좋아하지만, TEST1 선언의 동일한 유형을 시도하는 것을 C++ : 함수를 사용하여 자동으로 클래스를 변수로 선언하기

$ g++ --std=c++1z main.cpp 
main.cpp: In function ‘int main()’: 
main.cpp:13:20: error: use of deleted function ‘obj::obj(obj&&)’ 
    auto test1 = obj(); 

공지 사항

는 컴파일러 : 코드를 컴파일

class obj 
{ 
    public: 
    obj() {}; 
    obj(obj&& o) = delete; 
}; 

int main() 
{ 
    obj test0; 
    auto test1 = obj(); 

    return 0; 
} 

:

다음 코드를 가지고 오류. 분명히 컴파일러 오류가 있어야하지만이 경우에는 obj을 자동으로 정의 할 수 없습니까? 내가 제어 할 수없는 QT 객체로이 문제를 겪고있다.

변수를 선언하기 위해 C++ 98 형식을 여전히 사용하고 있습니까? 아니면 auto를 사용하는 다른 방법이 있습니까?

감사합니다 !!! 선언

auto test1 = obj(); 

그것이를 rvalue 같이 컴파일러의 우측에있는 개체를 이동하려고에서

+1

'auto test1 = obj();'를 사용하면 "copy initialization"을 사용 중입니다. 그러나'obj'는 복사 생성자 (복사 생성자의 암시 적 생성을 막는 선언 된 이동 생성자를 가짐) 또는 constructible (삭제 된 것으로 선언 됨)으로 이동하지 않습니다. – KABoissonneault

+0

앞으로 이러한 트랩을 방지하려면 C++의 "Rule of 5"사용을 고려하십시오. – KABoissonneault

+0

감사합니다. 무슨 일이 일어나고 있고 왜 작동하지 않는지 이해합니다. 제 질문은 이런 종류의 수업에서 자동으로 사용할 수 있나요? 그렇다면 어떻게. –

답변

5

이것은 C++ 17에서는 정상입니다. 보장 된 사본 elision은 이동 생성자가 개념적으로 호출되지 않도록 규칙을 조정하므로 삭제되었거나 액세스 할 수 있는지 여부는 중요하지 않습니다. 당신은 너무 많은 auto 사랑한다면

다음하기 전에, 당신은

auto&& test1 = obj(); 

이 임시 obj 객체를 생성하고 참조의 그것의 수명을 연장 기준 test1에 바인드 할 수 있습니다. 약간의 예외를 제외하고,이 동작은 C++에서 얻을 수있는 것과 완전히 동일합니다. auto.

+0

rvalue 레퍼런스는'const auto &'와 같은 방식으로 임시 변수의 수명을 연장합니까? – KABoissonneault

+0

@KABoissonneault 예. –

+0

오, 소년! 방금 해봤는데이게 작동합니다. 정확히 내가 무엇을 찾고 있었는지. 실제로 삭제 된 메소드를 호출 할 수없는 이유를 설명하는 대신 질문을 읽은 것에 대해 감사드립니다! –

3

. 이동할 수 없습니다 (이동 도구가 삭제됨으로 표시됨). 컴파일러는 이동하려고 시도하지만 이동 관리자가 삭제되기 때문에 복사 관리자도 삭제됩니다 (이동 관리자는 삭제되었지만 여전히 사용자 정의이며 it is selected as a candidate during overload resolution). 따라서 코드가 컴파일되지 않습니다.

+0

고마워요, 정확히 무엇을하고, 내 질문은,이 경우에는 test1 변수를 선언하는 데 사용할 수 있습니까? –

+1

'auto' 선언은 정상이며 컴파일 실패와 아무 관련이 없습니다. –

3

오류는 특별히 auto의 사용과 관련이 없습니다.

obj test1 = obj(); 

도 컴파일되지 않습니다. obj()은 r 값이므로 컴파일러에서 이동하려고하지만 이동 생성자가 삭제됩니다. 이동 생성자를 삭제하면 컴파일러에서 복사 생성자를 생성 할 수 없기 때문에 복사 생성자도 복사 할 수 없으므로 오류가 발생합니다.

관련 문제