Ссылки и временные переменные
От: Neavirc  
Дата: 04.05.08 12:35
Оценка:
Предположим есть такой вызов:

const int& r = atoi("12");


Мне интересно, создается ли дополнительная временная переменная (как в случае с 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, но вообще в с++ вроде должно быть так.
Re: Ссылки и временные переменные
От: Vain Россия google.ru
Дата: 04.05.08 13:34
Оценка:
Здравствуйте, Neavirc, Вы писали:

N>
const int& r = atoi("12");

Если вас интересует, будет ли жить 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.]
[Даю очевидные ответы на риторические вопросы]
Re[2]: Ссылки и временные переменные
От: Neavirc  
Дата: 04.05.08 13:56
Оценка:
Здравствуйте, 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
только там ещё есть небольшая разница, иначе бы
int& r = atoi("12");

прокатило
Re[2]: Ссылки и временные переменные
От: Programador  
Дата: 05.05.08 16:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>на правду похоже, что если инициализатор для 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 не звалось
полиморфную ссылку получить не удастся
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.