2016-08-05 5 views
2

임시 테이블에서 쌍을 구성하려고합니다. 내가 이해하는 것으로부터 std :: pair는 필요한 생성자를 제공하지만 작동하게 만들 수는 없다. 내가 clang++-3.8 --std=c++14 이것을 컴파일하려고임시 테이블에서 쌍 만들기

#include <utility> 

struct Test { 
    Test() : a(1.0) {} 

private: 
    double a; 
    Test(Test&&) = default; 
    Test(const Test&) = delete; 
    Test& operator=(Test&&) = delete; 
}; 

int main (int argc, char** argv) { 
    std::pair<Test, double> result(Test(), 0.0); 
} 

: 이것은 내 최소한의 예입니다. Test의 복사본 생성자가 쌍으로 호출됩니다. 삭제되었으므로 오류 call to deleted constructor of 'Test'이 표시됩니다. gcc와 유사한 오류가 발생하기 때문에 컴파일러에서 문제가되는 것 같지 않습니다 (https://ideone.com/n5GOeR 참조).

누군가 위의 코드가 컴파일되지 않는 이유를 설명 할 수 있습니까?

+2

'테스트'를 복사하거나 이동할 방법이 없기 때문에'std :: pair'의 생성자가 어떻게 할 것으로 기대합니까? – Quentin

+0

나는'Test'에 대한 이동 생성자를 명시 적으로 활성화하려고했습니다. – user3910279

+1

일단 이동 생성자를'public' 섹션에 넣으면 [잘 작동합니다] (http://coliru.stacked-crooked.com/a/77a1983a12219dfc). – Quentin

답변

5

내 GCC (6.1.1) 더 도움이되는, 약간 다른 오류 메시지를 제공합니다 :

t.C:8:3: note: declared private here 
    Test(Test&&) = default; 
    ^~~~ 

귀하의 이동 생성자는 비공개입니다. 분명 공개되어야합니다.

+0

이상한 점은 과부하 해결로 선택해서는 안되는 (삭제 된) 복사본 생성자라는 것입니다. 어떤 버전의 GCC Ideone이 사용되는지 모르지만 버그가있는 것 같습니다. – Quentin

+0

예, gcc가 더 나은 진단을 제공합니다. 업데이트 됨. –

+0

@Quentin 이것은 이상합니다. gcc.godbolt.org와 GCC의 모든 버전에서 4.4.7 (가장 오래된 것)부터 시작하여 private 인 이동 생성자에 대한 정확한 오류가 발생했습니다. –