2014-03-27 24 views
2

成员初始值设定项中使用的sizeof的行为是什么?我无法找到关于这个的描述。在下面的代码示例中它是安全的吗?即struct会员编译后会把A正确的大小写入b成员初始值设定项中使用的sizeof的行为是什么?

struct A 
{ 
    int a = 0; 
    int b = sizeof(A); 
    int c = 3; 
    int d = 4; 
    char s[256]; 

    A() 
    { 
     //printf("b = %d\n", b); 
    } 
}; 
+1

应该正常工作。结构声明不依赖于初始化器,所以在创建结构的时候sizeof将被填充,此时结构的大小已知。 –

+0

你应该尝试一些更有趣的事情。添加地图或其他东西。 –

+2

“添加地图”有什么不同?当涉及到'sizeof'时,'std :: map'具有固定的大小。它可能会有不同的动态大小,但这完全是无关紧要的。只要编译器知道'class'或'struct'的定义,它就可以正常工作。任何其他类型的内容都不能包含未知大小的元素。这就是为什么你必须使用指针或引用尚未完全定义的对象。 –

回答

5

一个struct的大小在编译比struct内的值的设置早得多确定。

+0

请注意,这是因为非静态成员的初始化实际上与您在构造函数的定义中获得的范围相同。如果代码尝试了'struct A {static constexpr int i = sizeof(A); };那么它将无法工作,因为该初始化器在不同的范围内,并且类型在那里不完整。 – bames53

相关问题