gcc aggregate initialization bug
От: night beast СССР  
Дата: 28.04.17 06:10
Оценка: 85 (3)
здесь
Re: gcc aggregate initialization bug
От: kov_serg Россия  
Дата: 28.04.17 06:55
Оценка:
Здравствуйте, night beast, Вы писали:

NB>здесь


Если не использовать C++11 такой проблемы нет?
Re[2]: gcc aggregate initialization bug
От: night beast СССР  
Дата: 28.04.17 07:10
Оценка:
Здравствуйте, kov_serg, Вы писали:

NB>>здесь


_>Если не использовать C++11 такой проблемы нет?


там странно. если дать имя переменной, то деструктор вызывается.

до C++11 без создания переменной вроде такая инициализация не работает.
поэтому все нормально.
Re[3]: gcc aggregate initialization bug
От: Кодт Россия  
Дата: 28.04.17 11:54
Оценка:
Здравствуйте, night beast, Вы писали:

NB>там странно. если дать имя переменной, то деструктор вызывается.


NB>до C++11 без создания переменной вроде такая инициализация не работает.

NB>поэтому все нормально.

Грешил на кривизну initializer_list, но нет! Если объект гетерогенный, то он всё равно точно так же крешится.

А вот terminate — это баг или стандарт?
struct Okay {
    Okay(bool v) {
        std::cout << this << "->" << __FUNCTION__ << "(" << v << ")" << std::endl;
        if(!v) throw std::runtime_error("f");
    }
    ~Okay() {
        std::cout << this << "->" << __FUNCTION__ << std::endl;
    }
};

struct User
{
    //User(bool b1, bool b3) : ok1(b1), ok3(b3) {}
    Okay ok1 = true, ok2 = false, ok3 = true;
};

void process(User) {}

int main()
{
    try {
        User u; // приводит к terminate при броске исключения
        User u { true, true, false }; // честно вызывает деструкторы первых двух членов
        process(User()); // опять terminate
        process(User{true, true, false}); // теряет деструктор первого члена
    }
    catch (...) {}
}
Перекуём баги на фичи!
Re[4]: gcc aggregate initialization bug
От: night beast СССР  
Дата: 28.04.17 12:26
Оценка: +1
Здравствуйте, Кодт, Вы писали:

К>Грешил на кривизну initializer_list, но нет! Если объект гетерогенный, то он всё равно точно так же крешится.


К>А вот terminate — это баг или стандарт?


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