4
#include <iostream> 

struct A { 
    int x; 
}; 

void foo(A a) { 
    std::cout << a.x << std::endl; 
} 

int main() { 
    A a; 
    foo(a); // -7159156; a was default-initialized 
    foo(A()); // 0; a was value-initialized 
} 

으로 기본 초기화 (NOT 값/제로 초기화) POD를 가져 오기? 값 초기화 또는 lvalue 중 하나를 사용해야합니까?그것을 가치를 초기화하지 않고 <code>foo()</code>에 유형 <code>A</code>의를 rvalue를 통과 할 수있는를 rvalue

"비용이 많이 든다"값 초기화가 10 나노초를 넘지 않을 때 무슨 일이 일어날 지 물어볼 수 있습니다. 어때? valgrind로 초기화되지 않은 메모리 액세스로 인해 레거시 앱에서 버그를 찾고 있습니다. 0은 앱의 유효한 값으로 간주되지 않습니다. 값을 초기화하면 valgrind가 초기화되지 않은 메모리 액세스 위치를 찾을 수 없습니다.

초기화되지 않은 값을 인쇄하는 것은 UB이지만 내 "실제"유스 케이스는 인쇄에만 국한되지 않는다고 말할 수 있습니다. 내 질문은 그것 없이는 유효해야합니다.

+0

초기화되지 않은 클래스 멤버가 동작을 정의 했습니까? –

+1

'A'는 POD가되기 위해 모든 상자를 체크해야합니까? 비어있는 사용자 제공 기본 생성자를 제공 할 수 있으면 값 초기화가 default-initialization과 실질적으로 동일 해지며 원하는 정의되지 않은 동작을 얻을 수 있습니다. – bogdan

+0

@bogdan'A'는 제 통제에서 벗어날 수 있습니다. 예 : 'struct tm' – nodakai

답변

1

질문을 올바르게 이해하면 foo(A()); 또는 A()이 호출되어 사용자의 기본 초기화가없는 유사한 경우를 대신해야합니다. 여기이 경우 하나

내가 생각 해낸 것입니다 : 내가 A() = default을 추가하려고

  • 먼저 (하지만이 나이가 C++ 표준 작동하지 않을 수 있습니다) 그리고 난 interesting results했다. 당신이 제공 한 정확한 샘플은 처음 0 번 역순으로 인쇄하고 난수를 뒤집는 방식으로 작동합니다. 난 그냥 A() = default;를 사용하지 않고

  • 두 번째는 foo(make<A>())처럼 사용하고 당신이 원하는 결과를 얻을 수 있습니다 사본의 비용으로 템플릿 기능

    template <class T> T make() { T tmp; return tmp; } 
    

    를 사용 (또는 이동).