когда мы пишем в функции
const char *t = "Hello world";
всем понятно что сама строка "Hello world" существует не на стеке, а в статической памяти. На стеке существует только указатель t. Благодаря этому совершенно корректно вернуть этот указатель из функции — объект, на который он указывает (строка) при выходе из функции не разрушится.
Но можно ли сделать так для обычных классов? Например есть код
struct D
{
const char * text;
D( const char * t)
{
text = t;
}
};
Объект такого класса, будучи создан аналоничным образом, создается уже НА СТЕКЕ:
D * d = &D ("Hello" );
соответственно, возвращать его из функции уже некорректно. Конечно, если объявить его статическим явно отдельной переменной, то все будет работать:
static D _tmp = D ("Hello" );
D * d = &_tmp;
Но вот так объявлять не хотелось бы, так как лишняя строчка, лишнее имя в области видимости. Особенно если нужно заменить старом коде в 500 местах разные строки, создаваемые подобным образом, на объекты.
Пробуем странное...
D * d = &(static D ("Hello" ));
Компилируется. Но увы — не работает. Адрес объекта все равно стековый. Но если не работает — тогда почему компилируется?
И есть ли какие-то преемлемые решения создания безымянных статических объектов произвольного типа прямо в выражении?
Пока едиственное что пришло в голову — вот такое, и завернуть это в макрос
D* d = []()->D* { static D _d("Hello"); return &_d;}();
Может есть что еще?