После перевода проекта на 2015 как обычно все сломалось.
При изучении обнаружилась интересная вещь
в конструкции типа
class blabla
{
public:
blabla();
private:
std::atomic<bool> TestValue;
}
blabla::blabla() /*:TestValue(false)*/
{
}
TestValue после срабатывания конструктора равно true. Если разкомментить то все нормально. На 2013 честно было false в обоих случаях.
В логе изменений версии написано что они там что-то такое доработали с оператором =, возможно увлеклись.
Вопрос в том, являеться ли это багом. По-моему-являеться, но есть некоторые сомнения.
Здравствуйте, Teolog, Вы писали:
T>После перевода проекта на 2015 как обычно все сломалось.
... T>TestValue после срабатывания конструктора равно true. Если разкомментить то все нормально. На 2013 честно было false в обоих случаях.
Мы тоже на эти грабли попали, т.к. у студии поведение поменялось и она перестала инициализировать атомики.
Это полностью соответствует стандарту, см. http://en.cppreference.com/w/cpp/atomic/atomic/atomic
Так что нормальный путь — это найти все места и проинициализировать атомики в коде явно
Есть очень удобный метод инициализации:
class blabla
{
private:
std::atomic<bool> TestValue = false;
};
У нас большинство проблем было выявлено автотестами.
Печально это. Починить все починил понятно, но как-то это эзотерично выходит.
Придется теперь следить еще за одной ерундой вида-не пытайся понять, просто запомни.
И кому этот конструктор мешал?
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, Teolog, Вы писали:
T>>После перевода проекта на 2015 как обычно все сломалось. U>... T>>TestValue после срабатывания конструктора равно true. Если разкомментить то все нормально. На 2013 честно было false в обоих случаях.
U>Мы тоже на эти грабли попали, т.к. у студии поведение поменялось и она перестала инициализировать атомики. U>Это полностью соответствует стандарту, см. http://en.cppreference.com/w/cpp/atomic/atomic/atomic U>Так что нормальный путь — это найти все места и проинициализировать атомики в коде явно U>Есть очень удобный метод инициализации: U>
Здравствуйте, Teolog, Вы писали:
T>Печально это. Починить все починил понятно, но как-то это эзотерично выходит. T>Придется теперь следить еще за одной ерундой вида-не пытайся понять, просто запомни.
Такое поведение для всех встроенных типов, не инициализируешь, в нём мусор. T>И кому этот конструктор мешал?
Похоже решили сделать одинаково со встроенными типами.
Так в том то и дело, что выглядит оно не как встроенный тип, а как шаблон класса.
Соответственно первая и последняя мысль по поводу инициализации: как-нибудь само.
А про встроенные типы я понятно в курсе, еще одни любимые грабли. Диагностики нет, без статического анализатора фиг догадаешься что забыл чего-нибудь инициализировать в классе. Отладочная работает нормально, а релизная с вероятностью 50% от запуска к запуску ). Был у меня уже симулятор морской рации который связывался с вероятностью 50%. Неделю страдал с ним пока разобрался.
Здравствуйте, Igore, Вы писали:
I>Здравствуйте, Teolog, Вы писали:
T>>Печально это. Починить все починил понятно, но как-то это эзотерично выходит. T>>Придется теперь следить еще за одной ерундой вида-не пытайся понять, просто запомни. I>Такое поведение для всех встроенных типов, не инициализируешь, в нём мусор. T>>И кому этот конструктор мешал? I>Похоже решили сделать одинаково со встроенными типами.