Re[6]: Поясните за деструкторы thread_local (3.6.3/1)
От: Alexander G Украина  
Дата: 21.03.17 11:22
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Для нелокальных — если компилятор предпочитает пакетную инициализацию всех переменных в единице трансляции, то он может сократить слагаемые — родить две такие функции touch_everything, kill_everything на всю единицу.


kill_everything точно может?

Реализации выводят строки 1, 2, 3.
C kill_everything, получается, будет 1, 3, 2
и UB, если разкомментировать x.f
(да и с закоментированным тоже, cout тоже объект, попадающий в kill_everything).

#include <iostream>
using namespace std;

struct X
{
    ~X() { std::cout << "3\n";  }
    
    void f() {}
} x;


struct Y
{
    ~Y() 
    {
        static struct Z 
        {
            ~Z() 
            {
                //x.f();
                std::cout << "2\n";
            } 
        } z;
        
        std::cout << "1\n";  
    }
} y;

int main() 
{
    return 0;
}

http://ideone.com/wMuUGA
Русский военный корабль идёт ко дну!
Отредактировано 21.03.2017 11:33 Alexander G . Предыдущая версия . Еще …
Отредактировано 21.03.2017 11:26 Alexander G . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.