Здравствуйте, night beast, Вы писали:
NB>здесь
Если не использовать C++11 такой проблемы нет?
Здравствуйте, kov_serg, Вы писали:
NB>>здесь
_>Если не использовать C++11 такой проблемы нет?
там странно. если дать имя переменной, то деструктор вызывается.
до C++11 без создания переменной вроде такая инициализация не работает.
поэтому все нормально.
Здравствуйте, 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 (...) {}
}
Здравствуйте, Кодт, Вы писали:
К>Грешил на кривизну initializer_list, но нет! Если объект гетерогенный, то он всё равно точно так же крешится.
К>А вот terminate — это баг или стандарт?
имхо баг.
но другой