2009-04-06 5 views
1

좀 '레거시'코드가 (내가 변경할 수는 없지만에 추가 할 필요가) :초기화 및 할당

template<typename T> T Foo(T& target) 
{ 
    //Assign to 'target', but never read from it before that. 
    //Also, 'target' is going to be a POD-type. 

    target = T(); 

    return target; 
} 

int main() 
{ 
    float value = Foo(value); 
} 

이 (즉, 그 확인하고 안전하지 않은 느낌 target은 사용되기 전에 할당되지 않습니다.) 이런 종류의 인터페이스에는 다른 치명적인 문제가 있습니까? 코드를 할 경우

+0

나는 그것이 안전하지 않다고 느끼고이 문제를 다루는 표준에서 아무것도 찾을 수 없다는 것에 동의한다. 이런 식으로 된 이유가 있습니까? 그렇지 않다면, 나는 보통 당신이 그것을 바꿀 것을 제안 할 것이지만 당신은 할 수 없다고 말했기 때문에, 나는 그것으로 살아가는 것을 배우는 것의 단지 사례라고 생각합니다. : –

답변

1

음 .. :

T value; 

는 값은이 호출 생성자의 얻을 것이다. 템플릿은 정직하게도 생성자가 단지 두 번 호출되는 것처럼 보입니다. T는 그냥 평범한 오래된 데이터 인 경우

또한이 후 발생할 수있는 더 치명적인 문제 ...

정확히 발생 무슨 걱정이 없다?

+0

Foo의 스코프가 입력되었을 때 target (일명 main의 값)이 제대로 초기화되지 않았습니다. 의미가있는 값이 지정되기 전에 Foo에서 우연히 읽혀지면 문제가 발생할 수 있습니다 –

+0

우우. 생성자가 그 시점에서 호출되었는지 알지 못한다. 일반 오래된 데이터의 경우 스택 공간을 예약 할 것이므로 너무 걱정하지 않아도된다. 내가 생각할 수있는 최악의 경우는 –

+0

동일 관심사 UB가 초기화되지 않은 POD 유형을 읽는 것입니까? –