C++对POD类型的typedef进行值初始化吗?

9

请问C ++对简单的POD typedef执行值初始化吗?

假设

typedef T* Ptr;

Ptr()

您希望进行值初始化并保证等于(T*)0吗?

例如:

Ptr p = Ptr();
return Ptr();
2个回答

17
它确实有作用。对于类型 TT() 进行值初始化一个类型为 T 的“对象”,并产生一个右值表达式。
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提供了一个名为value_initialized的类来解决这个问题,而C++1x将提供以下替代语法。

int a{};

在标准的严谨措辞中,这听起来像是:

表达式T(),其中T是一个简单类型说明符(7.1.5.2),用于非数组完整对象类型或(可能带有cv限定符的)void类型,创建指定类型的rvalue,该rvalue被值初始化。

由于typedef名称是类型名称,本身就是简单类型说明符,因此这个过程完全可行。

3
我一直在详细阅读这份标准草案,试图弄清楚这个问题。我忘记了typedef,并试图弄清楚指针类型如何成为简单类型说明符(实际上不是这样的),现在我明白了:你不能这样做int*(),但如果T被typedef为int*,那么你可以这样做T()。 - Adam Rosenfield
非 POD 类型和 POD 成员怎么办? - anon
结构体A{~A() { } int a;}; 是一个非POD类型。如果您自己引入了构造函数,那么“a”的值当然取决于该构造函数的操作。 - Johannes Schaub - litb

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: -71 -120 4

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接