У меня есть следующий код:
#include <stdexcept>
#include <iostream>
struct ok {
int _n;
ok(int n) : _n(n) { std::cerr << "OK" << n << " born" << std::endl; }
~ok() { std::cerr << "OK" << _n << " gone" << std::endl; }
};
struct problematic {
~problematic() noexcept(false) { throw std::logic_error("d-tor exception"); }
};
ok boo() {
ok ok1{1};
problematic p;
ok ok2{2};
return ok{3}; // Only constructor is called...
}
int main(int argc, char **argv) {
try {boo();} catch(...) {}
}
Я вижу, что он деструктор ok {3} не вызывается, вывод:
OK1 born
OK2 born
OK3 born
OK2 gone
OK1 gone
Это ожидаемое поведение для С++ 14?
редактирует:
Компиляция с gcc 6.3