VC7.1: баг в статической инициализации
От: folk Россия  
Дата: 13.10.04 02:20
Оценка:
Долго не мог понять что у меня не так... Эффект проявляется только в релизе.

Если одно из полей структуры константное, то поле-массив-символов при инициализации строковым литералом забивается нулями. Короче вот:
#include <iostream>

struct Pin
{
  unsigned const idx;
  char name[4];
};

Pin a01 = { 1, "A01" };

int main()
{
  std::cout << a01.idx << ' ' << a01.name << '\n';
}

Вывод
1
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re: VC7.1: баг в статической инициализации
От: Евгений Коробко  
Дата: 13.10.04 05:09
Оценка: -1
А какой смысл в нестатическом константном члене?
Я так подозреваю, что в данной ситуации константный член автоматом делается статическим, а строки инициализируется значением 1. В старшем байте получается 0.
Posted via RSDN NNTP Server 1.9 gamma
Евгений Коробко
Re[2]: VC7.1: баг в статической инициализации
От: folk Россия  
Дата: 13.10.04 05:41
Оценка:
Здравствуйте, Евгений Коробко, Вы писали:

ЕК>А какой смысл в нестатическом константном члене?


Как правило так не делают, но ничего запретного в этом нет. Тем самым устанавливается, что значение некоторого поля объекта не может быть изменено после инициализации/конструирования, я рассматривал это как дополнительную защиту/комментарий.

ЕК>Я так подозреваю, что в данной ситуации константный член автоматом делается статическим, а строки инициализируется значением 1. В старшем байте получается 0.


Ничего не понял. Сам подумай, если есть несколько таких объектов (массив), и константный член каждого инициализорован по-разному, то чему будет равен этот статический член?
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re: VC7.1: баг в статической инициализации
От: dupamid Россия  
Дата: 13.10.04 06:13
Оценка:
Здравствуйте, folk, Вы писали:

F>Долго не мог понять что у меня не так... Эффект проявляется только в релизе.


Действительно баг, проявляется при /O1 или /O2 и только на MSVC7.1.

MSVC7 и MSVC6 дают ошибку:
test167.cpp(9) : error C2552: 'a01' : non-aggregates cannot be initialized with initializer list
'Pin' has a const data member 'Pin::idx' : Types with a const data member are not aggregate

В Whidbey она исправлена, все работает как надо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.