C++은 간단한 POD typedefs에서 초기화를 수행합니까?C++은 POD typedef의 초기화를 평가합니까?
가정
typedef T* Ptr;
는
Ptr()
을 수행 동일 (T*)0
에 값 초기화 및 보장합니까?
Ptr p = Ptr();
return Ptr();
C++은 간단한 POD typedefs에서 초기화를 수행합니까?C++은 POD typedef의 초기화를 평가합니까?
가정
typedef T* Ptr;
는
Ptr()
을 수행 동일 (T*)0
에 값 초기화 및 보장합니까?
Ptr p = Ptr();
return Ptr();
있습니다. 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는 다음 대체 문법을 갖습니다.
int a{};
,이 T 비 어레이 전체 오브젝트에 대한 간단한 형태 지정자 (7.1.5.2)이다
발현 T() 같은데 type 또는 (cv 수식 가능) void 유형을 사용하여 값 형식으로 초기화되는 지정된 유형의 rvalue를 만듭니다.
typedef-name은 simple-type-specifier 자체,이 잘 작동합니다.
#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 객체를 생성하지만 초기화 (첫 번째 것과 비슷한 출력).
나는이 사실을 알아 내려고 초안 표준을 열심히 검토하고 있습니다.나는 typedef를 잊어 버렸고 포인터 타입이 simple-type-specifier (어떻게 될 것인가)가 될 수있는 방법을 찾아 내려고 노력했다. 이제는 이해가된다 : int *()를 할 수는 없지만 할 수있다. T가 int *로 typedef'ed되면 T(). –
POD 유형이 아니고 POD 회원은 어떻게됩니까? –
구조체 A {~ A() {} int a; }; 비 포드 유형입니다. 당신이 생성자를 직접 도입했다면, "a"의 값은 생성자가하는 일에 달려 있습니다. –