Мне интересно, создается ли дополнительная временная переменная (как в случае с const int& a = 12 в которую копируется результат atoi()?
Другими словами, какой из вариантов событий больше похож на правду:
Вариант #A.
1. Выделяется память под результат atoi().
2. Результат копируется во временную переменную.
3. Для временной переменной создается ссылка r.
Вариант #B.
1. Выделяется память под результат atoi().
2. Для временной переменной созданной в п.1 создается ссылка r.
--
gcc 4.2.2
Спасибо =)
Re: Ссылки и временные переменные
От:
Аноним
Дата:
04.05.08 13:26
Оценка:
Здравствуйте, Neavirc, Вы писали:
N>какой из вариантов событий больше похож на правду
на правду похоже, что если инициализатор для const T& не lvalue то при необходимости осуществляется неявное преобразование к Т
результат помещется во временную переменную типа Т и временная переменная используется в качестве значения инициализатора
не знаю как в gcc, но вообще в с++ вроде должно быть так.
Если вас интересует, будет ли жить int после вызова функции, т.е. после точки с запятой, то — да. Этот код д.б. примерно аналогичен следующему:
int i = atoi("12");
const int& r = i;
С той лишь разницей, что имени "i" у вас нет. В общем, тип int copy-конструируется с "внутреннего" стека функции atoi во "внешний", потому-что atoi возвращает объект по значению, что говорит, что он будет жить во внешнем скопе.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
V>С той лишь разницей, что имени "i" у вас нет. В общем, тип int copy-конструируется с "внутреннего" стека функции atoi во "внешний", потому-что atoi возвращает объект по значению, что говорит, что он будет жить во внешнем скопе.
Большое спасибо, все понял!
Re[2]: Ссылки и временные переменные
От:
Аноним
Дата:
04.05.08 13:57
Оценка:
Здравствуйте, Vain, Вы писали:
N>>
const int& r = atoi("12");
V>Этот код д.б. примерно аналогичен следующему: V>
V>int i = atoi("12");
V>const int& r = i;
V>
V>С той лишь разницей, что имени "i" у вас нет.
+1
только там ещё есть небольшая разница, иначе бы
Здравствуйте, Аноним, Вы писали:
А>на правду похоже, что если инициализатор для const T& не lvalue то при необходимости осуществляется неявное преобразование к Т А>результат помещется во временную переменную типа Т и временная переменная используется в качестве значения инициализатора А>не знаю как в gcc, но вообще в с++ вроде должно быть так.
получается что const T&= ничем не отличается от Т =
#include <stdlib.h>
#include <stdio.h>
int nn;
struct A
{ int ia;
A():ia(++nn)
{
printf(" +A ");
}
virtual ~A()
{
printf(" ~A%d ",ia);
}
};
struct B:public A
{
int i;
B():i(++nn)
{
printf(" +B ");
}
virtual ~B()
{
printf(" ~B%d_%d ",i,ia);
}
};
int variant=0;
int main(int argc, char* argv[])
{
printf("\n");
{
const A &ar=variant?A():B();
printf(" variant=%d ",variant);
}
printf(" ");
return 0;
}
+A +B ~B2_1 ~A1 variant=0 ~A1
тоесть B скопировалось в тмп A не звалось
полиморфную ссылку получить не удастся