Информация об изменениях

Сообщение Re[6]: Поясните за деструкторы thread_local (3.6.3/1) от 21.03.2017 11:22

Изменено 21.03.2017 11:33 Alexander G

Re[6]: Поясните за деструкторы thread_local (3.6.3/1)
Здравствуйте, Кодт, Вы писали:

К>Для нелокальных — если компилятор предпочитает пакетную инициализацию всех переменных в единице трансляции, то он может сократить слагаемые — родить две такие функции 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
Re[6]: Поясните за деструкторы thread_local (3.6.3/1)
Здравствуйте, Кодт, Вы писали:

К>Для нелокальных — если компилятор предпочитает пакетную инициализацию всех переменных в единице трансляции, то он может сократить слагаемые — родить две такие функции 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