이 코드는 g ++ 6.1에서 성공적으로 컴파일하지만, 그 소리 3.8 오류를 제공합니다공변 반환 형식, CONST 네스, 불완전한 클래스
class C;
class Base {
public:
virtual const C *getC();
};
class Derived : public Base {
public:
virtual C *getC();
};
는 다음과 연타에서 오류가 될 때 :
$ dev/compilers/linux-x86_64-2.12.2/clang3.8/bin/clang++ -Wall -c testcovariantreturn.cxx
testcovariantreturn.cxx:10:20: error: return type of virtual function 'getC' is not covariant with the return type of the function it overrides ('C' is incomplete)
클래스 C가 전달 선언보다 완전히 정의 된 경우 오류가 없습니다. 내 이해는 가상 메서드를 재정의 할 때 공변 (covariant)이 "적은"cv-qualification (즉, 반환 유형에서 const 삭제)을 허용한다는 것입니다.
완전한 형식을 요구하는 clang이 올바른지/허용 되었습니까? 그렇다면 이유는 무엇입니까? C의 정의를 어떻게 사용할 수 있습니까?
이것은 완전히 학문적 인 것이 아니며 큰 코드베이스에서 불필요한 포함을 추가하기를 꺼려하며 표준 사례로 선언하려고합니다.
이 코드는 공변이므로 이상적으로 받아 들여야합니다. 반대의'const' 분산은 공변 적이 지 않을 것이며 원래'const' 객체의 UB 수정을 지원할 것입니다. C++ 표준이 무엇에 관해서 말하고 있는지는 모르겠다. –