Статические безымянные объекты
От: x-code  
Дата: 20.10.14 09:01
Оценка:
когда мы пишем в функции
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;}();


Может есть что еще?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.