2009-05-25 2 views

답변

17

있습니다. T 유형의 경우 T()T 유형의 "객체"를 값 초기화하고 rvalue 표현식을 생성합니다.

int a = int(); 
assert(a == 0); 

동일위한 포드 클래스 :

struct A { ~A() { } int a; }; 
assert(A().a == 0); 

당신이 (A a()을 할 수 없으므로 작성에는 사용자가없는 일부 비 POD 클래스 또한

struct A { int a; }; 
assert(A().a == 0); 

사실은 생성자를 선언 함수 선언 대신에 boost는 클래스 value_initialized을 가지고 있습니다. C++ 1x는 다음 대체 문법을 갖습니다.

0 표준의 건조 말하면
int a{}; 

,이 T 비 어레이 전체 오브젝트에 대한 간단한 형태 지정자 (7.1.5.2)이다

발현 T() 같은데 type 또는 (cv 수식 가능) void 유형을 사용하여 값 형식으로 초기화되는 지정된 유형의 rvalue를 만듭니다.

typedef-name은 simple-type-specifier 자체,이 잘 작동합니다.

+3

나는이 사실을 알아 내려고 초안 표준을 열심히 검토하고 있습니다.나는 typedef를 잊어 버렸고 포인터 타입이 simple-type-specifier (어떻게 될 것인가)가 될 수있는 방법을 찾아 내려고 노력했다. 이제는 이해가된다 : int *()를 할 수는 없지만 할 수있다. T가 int *로 typedef'ed되면 T(). –

+0

POD 유형이 아니고 POD 회원은 어떻게됩니까? –

+0

구조체 A {~ A() {} int a; }; 비 포드 유형입니다. 당신이 생성자를 직접 도입했다면, "a"의 값은 생성자가하는 일에 달려 있습니다. –

2
#include <iostream> 
struct Foo { 
    char bar; 
    char baz; 
    char foobar; 
    // the struct is a POD 
    //virtual void a() { bar='b'; } 
}; 

int main() { 
    Foo o1; 
    Foo o2 = Foo(); 

    std::cout << "O1: " << (int)o1.bar <<" "<< (int)o1.baz <<" "<< (int)o1.foobar << std::endl; 
    std::cout << "O2: " << (int)o2.bar <<" "<< (int)o2.baz <<" "<< (int)o2.foobar << std::endl; 
    return 0; 
} 

출력 :

O1 : -27 -98 0

O2 : 0 0 0

추가()가 전파 초기화는 모든 POD 회원들에게 호출합니다.

O1 : -44 -27 -98

O2 : 가상 메소드 Uncomenting하여 출력을 변화 -71 -120 4

그러나 추가 소멸자 ~ 푸()을 억제하지 않는다 초기 POD 객체를 생성하지만 초기화 (첫 번째 것과 비슷한 출력).

관련 문제