Сообщение 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).
http://ideone.com/wMuUGA
К>Для нелокальных — если компилятор предпочитает пакетную инициализацию всех переменных в единице трансляции, то он может сократить слагаемые — родить две такие функции 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).
http://ideone.com/wMuUGA
К>Для нелокальных — если компилятор предпочитает пакетную инициализацию всех переменных в единице трансляции, то он может сократить слагаемые — родить две такие функции 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