2014-12-01 4 views
5

다음 코드에서 템플릿 구조 BB 및 CC는 생성자를 제외하고 거의 동일합니다. 템플릿 BB는 아무것도하지 않는 생성자를 사용하지만 템플릿 CC는 기본 생성자를 사용합니다."빈"생성자 대 암시 적 생성자

오류 C4700 : 나는 비주얼 스튜디오 2013 업데이트 4를 사용하여 컴파일 할 때 오류가 아니라 constInst를 선언 라인에 constInst2를 선언 라인에 발생합니다 초기화되지 않은 지역 변수를

'사용'인스턴스 2 ' 뿐만 아니라 '예'를 초기화 할 때

나는 같은 오류를 기대했다. 나는 this sentence?

"암시 적 선언 기본 생성자가 삭제되지 않는 경우 또는을 잘못 해석하고 있는가 0 사소한 것이 (즉, 기능 체가 생성되고 컴파일) 정의 컴파일러 및 비어 본체 빈 초기화리스트와 사용자 정의 생성자와 완전히 같은 효과를 갖는다. "

struct AA 
{ 
    typedef int a; 
    typedef const int b; 
}; 

template< typename A > 
struct BB 
{ 
    typename A::a a_A; 
    typedef typename A::b a_B; 

    BB() 
    {}; 
}; 

template< typename A > 
struct CC 
{ 
    typename A::a a_A; 
    typedef typename A::b a_B; 

    CC() = default; 
}; 

int main() 
{ 
    BB<AA> instance; 
    BB<AA>::a_B constInst(instance.a_A); 

    CC<AA> instance2; 
    CC<AA>::a_B constInst2(instance2.a_A); 

    return 0; 
} 
+1

특정 컴파일러 오류에 대해 질문 할 때 질문에 전체 오류 메시지를 포함하십시오. 그것은 많은 도움이됩니다. –

+0

@ MarkRansom : 질문을 업데이트했습니다. – Hector

+0

@Hector 나는 여러분의 코드를 그대로 사용하여 Visual Studio 2013 Update 4와 함께 컴파일하고 경고 만 받았다 :'경고 C4700 : 초기화되지 않은 지역 변수 'instance2'used' 또한 http : // ideone으로 문제없이 컴파일됩니다. com/Hc1jB4 – PaulMcKenzie

답변

1

Visual Studio에서 경고를 오류 (/ WX)로 처리하는 컴파일러 플래그가 있습니다. 경고를 오류로 처리하지 않으려면 해당 플래그를 끌 수 있습니다. 특정 경고를 무시하도록 선택할 수도 있습니다 (경고 C4100을 비활성화하려면/wd4100).

보고있는 것은 오류로 간주되는 컴파일러 경고입니다.

이것은 표준의 견적 해석과 관련이 없습니다. 당신은 부작용이 생성자에서 일을 할 수 있기 때문에

BB<AA> instance; 

의 경우 컴파일러는 경고 메시지를 발행하지 않습니다. 컴파일러는 생성자를 호출 할 때 부작용이 있는지 여부를 추론하기 위해 생성자를 구현하는 방법에 대한 세부 정보를 조사하지 않기로 결정합니다. 이 오브젝트를 구성하는 부작용이 없다는 사실을 유추 할 수있다

CC<AA> instance2; 

의 경우

.

+0

VS 2017에서는 실제로 오류입니다. 경고가 아닙니다. 그리고 나는 확실히 "경고를 오류로 취급"하지 않았습니다. 여전히 훌륭한 대답입니다. – TobiMcNamobi

+0

@TobiMcNamobi, VS 2017에 액세스 할 수 없습니다. 다른 출처에서 답변을 받으시기 바랍니다. –

관련 문제