Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Массив ссылок / 22 сообщений из 22, страница 1 из 1
15.08.2007, 16:48:31
    #34730163
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок
А что, у нас сабж создавать что ли нельзя?

Код: plaintext
1.
2.
3.
    int a, b;
    int &c[ 2 ]={a, b};
    int &d[ 2 ];

автор
c.cpp: In function `int main()':
c.cpp:41: error: declaration of `c' as array of references
c.cpp:41: error: assignment (not initialization) in declaration
c.cpp:42: error: declaration of `d' as array of references
...
Рейтинг: 0 / 0
15.08.2007, 18:09:22
    #34730491
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок
Akh пишет:
> А что, у нас сабж создавать что ли нельзя?

Нельзя.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
15.08.2007, 18:25:13
    #34730542
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок
MasterZivНельзя.

А чего так плохо?
Есть этому объеснения? Для указателей же можно. В чем здесь различие?
...
Рейтинг: 0 / 0
15.08.2007, 18:34:23
    #34730573
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок
i:\Learn\test\test.cpp(68): error C2440: 'initializing' : cannot convert from 'int' to 'int *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast

у меня так ругается
...
Рейтинг: 0 / 0
15.08.2007, 18:36:08
    #34730582
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок
может элемент массива не может выступать псевдонимом переменной?
...
Рейтинг: 0 / 0
16.08.2007, 09:41:15
    #34731290
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок
Tubrikможет элемент массива не может выступать псевдонимом переменной?

Тынца может, а сцылки нет? Интересно почему...
...
Рейтинг: 0 / 0
16.08.2007, 09:48:22
    #34731308
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок
Вообщем в стандарте нашел по этому поводу только 8.3.4/2, где сцылки не указаны. Почему, - остается только догадываться.
...
Рейтинг: 0 / 0
16.08.2007, 09:49:20
    #34731313
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок
Akh Tubrikможет элемент массива не может выступать псевдонимом переменной?

Тынца может, а сцылки нет? Интересно почему...

Имя массива - это адрес памяти, начиная с которого могут располагаться данные? Псевдоним переменной может быть представлен в виде данных? Т.е. сколько байт нужно, чтобы хранить псевдоним?
...
Рейтинг: 0 / 0
16.08.2007, 09:58:55
    #34731346
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок
Т.е. я что хотел узнать, если псевдоним - это просто другое имя, то выходит int &d[2]; - это массив имен (не данных!), а имя это просто ассоциация с ячейкой памяти, как сделать массив этих ассоциаций?

Код: plaintext
1.
2.
int a, b;
int &pa = a, &pb =b;
int c[ 2 ]={pa, pb};

хотя может просто не стали усложнять себе жизнь
...
Рейтинг: 0 / 0
16.08.2007, 09:59:47
    #34731348
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок
Tubrik Akh Tubrikможет элемент массива не может выступать псевдонимом переменной?

Тынца может, а сцылки нет? Интересно почему...

Имя массива - это адрес памяти, начиная с которого могут располагаться данные? Псевдоним переменной может быть представлен в виде данных? Т.е. сколько байт нужно, чтобы хранить псевдоним?

Интересное суждение. Допустим sizeof(Type&)==sizeof(Type*).
...
Рейтинг: 0 / 0
16.08.2007, 10:05:21
    #34731365
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок
Akh Tubrik Akh Tubrikможет элемент массива не может выступать псевдонимом переменной?

Тынца может, а сцылки нет? Интересно почему...

Имя массива - это адрес памяти, начиная с которого могут располагаться данные? Псевдоним переменной может быть представлен в виде данных? Т.е. сколько байт нужно, чтобы хранить псевдоним?

Интересное суждение. Допустим sizeof(Type&)==sizeof(Type*).
Код: plaintext
1.
sizeof(char &) == sizeof(char) ==  1 
sizeof(char &) != sizeof(char *)
...
Рейтинг: 0 / 0
16.08.2007, 10:16:24
    #34731398
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок
Tubrik[quot Akh]
Код: plaintext
1.
sizeof(char &) == sizeof(char) ==  1 
sizeof(char &) != sizeof(char *)


Если ты заметил выше я указал: "допустим"!

Ссылка хитрая штука. Она не является самим объектом, а лишь информирует о его месторасположении. В случае с массивами ее можно выродить в указатели.

Допустим у тебя есть следующий код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void func(int &i_) {
   i= 3 ;
};

int main() {
   int a, b;
   func(a);
   func(b);
};

что будет из себя представлять ссылка в функции? Указатель. Потомучто, в функции оператор присваивания не может знать место, куда ему положить значение, ибо оно разное.

Возможно sizeof(Type&)==sizeof(Type) - не является удачным решением.
...
Рейтинг: 0 / 0
16.08.2007, 10:40:08
    #34731480
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок
выходит ссылка - это совсем не тип данных, раз она интерпретируется по-разному в разных случаях, а раз это не тип данных, то может именно поэтому нельзя создать массив ссылок?
Где-нибудь оговаривается как должен реализовываться ссылочный механизм в компиляторе? Если нет, то могут же в другой версии сделать другую реализацию ссылок?
...
Рейтинг: 0 / 0
16.08.2007, 10:52:49
    #34731523
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок
Tubrikвыходит ссылка - это совсем не тип данных, раз она интерпретируется по-разному в разных случаях, а раз это не тип данных, то может именно поэтому нельзя создать массив ссылок?

Да, поэтому.

TubrikГде-нибудь оговаривается как должен реализовываться ссылочный механизм в компиляторе?

Конкретная реализация, думаю что нет. Но оговариваются свойства ссылок.

Tubrik Если нет, то могут же в другой версии сделать другую реализацию ссылок?

Могут, но свойства должны оставаться соотвествующими стандарту.
...
Рейтинг: 0 / 0
16.08.2007, 18:03:31
    #34733393
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок
Akh пишет:

Я все же думаю, что нельзя по причине того, что массив не обязательно
гарантирует инициализированности всех его элементов.
А ссылки должны быть обязательно инициализированы.

К тому же , для инициализации массива нужен static initializer,
а адрес переменной, используемый для инициализации ссылок, не может быть таким.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
16.08.2007, 18:23:55
    #34733447
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок
MasterZiv
Akh пишет:

Я все же думаю, что нельзя по причине того, что массив не обязательно
гарантирует инициализированности всех его элементов.
А ссылки должны быть обязательно инициализированы.

К тому же , для инициализации массива нужен static initializer,
а адрес переменной, используемый для инициализации ссылок, не может быть таким.
Posted via ActualForum NNTP Server 1.4

1. Массив использует инициализацию по умолчнию, как и простая переменная. Если инициализация по умолчанию отсутвует, то необходима явная инициализация. Пример класс TClass::TClass(int i). Конструктора по умолчанию нет, создать элемент можно только указав явный вызов конструктора. Ссылка, аналогично, (если представить, что ей разрешили стать объектом) не имеет конструтора по умолчанию. Поэтому массив будет гарантировать инициализацию всех элементов, как и для объектов класса без конструктора по умолчанию.

2. Я не знаю, что такое статический инициализатор (static initializer). В стандарте такого словосочетания не нашел.
...
Рейтинг: 0 / 0
16.08.2007, 20:26:19
    #34733624
Lelikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок
Akh MasterZiv
Akh пишет:

Я все же думаю, что нельзя по причине того, что массив не обязательно
гарантирует инициализированности всех его элементов.
А ссылки должны быть обязательно инициализированы.

К тому же , для инициализации массива нужен static initializer,
а адрес переменной, используемый для инициализации ссылок, не может быть таким.
Posted via ActualForum NNTP Server 1.4

1. Массив использует инициализацию по умолчнию, как и простая переменная. Если инициализация по умолчанию отсутвует, то необходима явная инициализация. Пример класс TClass::TClass(int i). Конструктора по умолчанию нет, создать элемент можно только указав явный вызов конструктора. Ссылка, аналогично, (если представить, что ей разрешили стать объектом) не имеет конструтора по умолчанию. Поэтому массив будет гарантировать инициализацию всех элементов, как и для объектов класса без конструктора по умолчанию.

2. Я не знаю, что такое статический инициализатор (static initializer). В стандарте такого словосочетания не нашел.

Под статической инициализацией понимают инициализацию на этапе компиляции, то есть уже на этапе компиляции должны быть известны значения помещаемые в массив.
...
Рейтинг: 0 / 0
17.08.2007, 00:04:54
    #34733818
Тынц.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок
Вроде как объяснения есть в ARM'e ($8.4.3) - нельзя, потому что запрещены указатели на ссылки, значит, для такого массива будет недопустима операция *(a+i).
Но самого ARM'a не нашёл, нашёл только ссылки на него...

Комментарии в исходниках gcc, которым, по-видимому, Akh и компилировал свой пример:
http://gcc.gnu.org/ml/gcc-patches/1999-11/msg00421.html
/* ARM $8.4.3: Since you can't have a pointer to a reference,
you can't have arrays of references. If we allowed them,
then we'd be saying x is valid for an array x, but
then you'd have to ask: what does `*(x + i)' mean? */
if (TREE_CODE (type) == REFERENCE_TYPE)
{
if (decl_context == TYPENAME)
cp_error ("cannot make arrays of references");
else
cp_error ("declaration of `%D' as array of references",
dname);
type = error_mark_node;
}


Ещё одна ссылка на тот же 8.4.3:
http://www.pa.msu.edu/courses/1996spring/PHY405/lect4.html
there are no arrays of references
double x, y, z;
double &v[3] = {x,y,z}; // illegal - no arrays of references
The reason (given in the Annotated Reference Manual,[[section]]8.4.3) is that by the equivalence of the subscripting operator and dereferencing (a is *(a+i)). So in the last example, v[0]==*(v+0), which means that v would have to be a "double &*", which we've already disallowed.


Тут http://www.stanford.edu/class/cs193d/handouts/19-midterm_solution.pdf ещё один вариант (на 10-й странице).
...
Рейтинг: 0 / 0
17.08.2007, 22:06:39
    #34736000
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок
Akh пишет:
> 1. Массив использует инициализацию по умолчнию, как и простая
> переменная. Если инициализация по умолчанию отсутвует, то необходима
> явная инициализация. Пример класс TClass::TClass(int i). Конструктора по

А при чем здесь инициализация по умолчанию ?
Ссылка не может быть инициализирована по умолчанию, неявно.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
20.08.2007, 09:54:03
    #34737564
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок
Ладно, всем спасибо.
...
Рейтинг: 0 / 0
20.08.2007, 12:54:47
    #34738234
Aklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок
ссылки ж вроде были созданы для передачи параметров в функции, а не для того, чтобы их вместо указателей использовать где попало.

узать указатели 2х

аффтопитезь: 4 8 15 16 23 42
...
Рейтинг: 0 / 0
20.08.2007, 13:51:04
    #34738453
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок
Aklinссылки ж вроде были созданы для передачи параметров в функции, а не для того, чтобы их вместо указателей использовать где попало.

узать указатели 2х

аффтопитезь: 4 8 15 16 23 42

Я, вообще-то считал, что ссылки созданы, как всегда инициализированные указатели. Как выразился Тубрик "псевдонимы". А уж где они используются - в параметрах функции, как свойство класса, это уже конкретные области применения.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Массив ссылок / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]