powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Массив ссылок
22 сообщений из 22, страница 1 из 1
Массив ссылок
    #34730163
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
Массив ссылок
    #34730491
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh пишет:
> А что, у нас сабж создавать что ли нельзя?

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

А чего так плохо?
Есть этому объеснения? Для указателей же можно. В чем здесь различие?
...
Рейтинг: 0 / 0
Массив ссылок
    #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
Массив ссылок
    #34730582
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может элемент массива не может выступать псевдонимом переменной?
...
Рейтинг: 0 / 0
Массив ссылок
    #34731290
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrikможет элемент массива не может выступать псевдонимом переменной?

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

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

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

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

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

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

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

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

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

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

Интересное суждение. Допустим sizeof(Type&)==sizeof(Type*).
Код: plaintext
1.
sizeof(char &) == sizeof(char) ==  1 
sizeof(char &) != sizeof(char *)
...
Рейтинг: 0 / 0
Массив ссылок
    #34731398
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
Массив ссылок
    #34731480
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выходит ссылка - это совсем не тип данных, раз она интерпретируется по-разному в разных случаях, а раз это не тип данных, то может именно поэтому нельзя создать массив ссылок?
Где-нибудь оговаривается как должен реализовываться ссылочный механизм в компиляторе? Если нет, то могут же в другой версии сделать другую реализацию ссылок?
...
Рейтинг: 0 / 0
Массив ссылок
    #34731523
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrikвыходит ссылка - это совсем не тип данных, раз она интерпретируется по-разному в разных случаях, а раз это не тип данных, то может именно поэтому нельзя создать массив ссылок?

Да, поэтому.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Под статической инициализацией понимают инициализацию на этапе компиляции, то есть уже на этапе компиляции должны быть известны значения помещаемые в массив.
...
Рейтинг: 0 / 0
Массив ссылок
    #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
Массив ссылок
    #34736000
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh пишет:
> 1. Массив использует инициализацию по умолчнию, как и простая
> переменная. Если инициализация по умолчанию отсутвует, то необходима
> явная инициализация. Пример класс TClass::TClass(int i). Конструктора по

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

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

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

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

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

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

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


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