繁体   English   中英

C ++是否重视POD typedef的初始化?

[英]Does C++ do value initialization of a POD typedef?

C ++是否在简单的POD typedef上进行值初始化?

假设

typedef T* Ptr;

Ptr()

进行值初始化并保证等于(T*)0

例如

Ptr p = Ptr();
return Ptr();

确实如此。 对于类型TT()值初始化类型为T的“对象”并产生rvalue表达式。

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

pod-classes也是如此:

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

对于一些没有用户声明构造函数的非POD类也是如此:

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

由于你不能做A a() (而是创建一个函数声明),boost有一个class value_initialized ,允许解决这个问题,而C ++ 1x将有以下替代语法

int a{};

在标准的干话中,这听起来像

表达式T(),其中T是非数组完整对象类型的简单类型说明符(7.1.5.2)或(可能是cv限定的)void类型,它创建指定类型的rvalue,它是值-initialized

由于typedef-name是一个类型名称,它本身就是一个简单类型说明符,所以这很好用。

#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

Adding()将初始化程序调用传播给所有POD成员。 取消发布虚拟方法会将输出更改为:

O1:-44 -27 -98

O2:-71 -120 4

但是添加析构函数~Foo()并不会抑制初始化,尽管它会创建非POD对象(输出类似于第一个)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM