首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VC++的一个大bug?为什么initializer-list不是值初始化结构?

VC++的一个大bug?为什么initializer-list不是值初始化结构?
EN

Stack Overflow用户
提问于 2012-12-17 02:02:41
回答 1查看 335关注 0票数 7

C++11标准8.5.4.3规定:

如果初始值设定项列表没有元素,并且T是具有默认构造函数的类类型,则对象是值初始化的。

代码语言:javascript
复制
struct A
{
    int get() { return i; }

private:
    int i;
};

int main()
{
    A a = {};

    int n = a.get();
    cout << n << endl;
    // n is a random number rather than 0

    return 0;
}

这是VC++的bug吗?我的VC++是最新的2012年11月CTP。

EN

回答 1

Stack Overflow用户

发布于 2012-12-17 19:45:06

值-非聚合类类型的初始化包含在8.5p8中。在您的例子中,(非联合)类有一个隐式声明的默认无参数构造函数(12.1p5),该构造函数不会被删除并且是微不足道的(同上)。因此,8.5p8的第二个项目适用:

-如果T是一个(可能是cv限定的)非联合类类型,没有用户提供或删除的默认构造函数,那么对象是零初始化的,如果T有一个非平凡的默认构造函数,则默认初始化;

因此,A应该是零初始化的,并且程序应该打印0

在以下程序中:

代码语言:javascript
复制
struct A { int get() { return i; } private: int i; };
#include <iostream>
int main() {
    char c[sizeof(A)];
    new (c) int{42};
    std::cout << (new (c) A{})->get() << '\n';
}

gcc-4.7.2正确地输出了0;gcc-4.6.3错误地输出了42;clang-3.0完全疯了,输出了垃圾(例如574874232)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13904020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档