Я столкнулся со следующим правилом (3.7.1 / 2 N3797):
Если переменная со статической продолжительностью хранения имеет инициализацию или
деструктор с побочными эффектами, он не должен быть устранен, даже если он
кажется неиспользованным, за исключением того, что объект класса или его копирование / перемещение может
быть исключены, как указано в 12.8.
Правда ли, что если мы объявим переменную со статической продолжительностью хранения, имеющую конструктор или деструктор с побочным эффектом, то память будет выделяться для этой переменной, даже если она не используется?
В частности, я пытаюсь поэкспериментировать со следующим кодом:
#include <csignal>
#include <iostream>
#include <cstdlib>
using std::cout;
struct data_member
{
data_member(){ cout << "data_member\n"; }
~data_member(){ cout << "~data_member\n"; }
};
struct Y
{
static data_member m;
Y(){ cout << "Y\n"; }
~Y(){ cout << "~Y\n"; }
};
Y y;int main()
{
}
Почему объект data_member не создан в примере?
Ну, так говорит стандарт, так что … да.
Как всегда, есть правило «как будто», позволяющее компилятору делать практически все что угодно, пока чистый эффект одинаков. Я мог бы представить, что если класс огромен для данных, но конструктор и деструктор (и никто другой) не имеют доступа к этим данным, компилятор может просто вызвать конструктор и деструктор в правильном порядке, не оставляя места для неиспользуемых данных ,
Что касается вашего примера, вы декларирование Y::m
но ты никогда определять Это. Так что его не существует. Если вы попытаетесь получить к нему доступ, вы получите ошибку компоновщика.