Справочное руководство по C++ | страница 52
>char cv[4] = {'a', 's', 'd', 'f', 0}; // ошибка
R.8.4.2 Символьные массивы
Массив символов (неважно, знаковых или беззнаковых) можно инициализировать строкой-литералом: символы строки последовательно инициализируют элементы массива. Следующее определение дает пример символьного массива, элементы которого инициализируются строкой:
>char msg[] = "Syntax error on line %s\n";
Заметим, что поскольку '\n' задает один символ, и поскольку добавляется завершающий символ '\0', sizeof(msg) равно 25.
Нельзя задавать больше инициализаторов, чем есть элементов в массиве, поэтому следующий пример ошибочен: здесь нет места для подразумевающегося символа конца строки ('\0'):
>char cv[4] = "asdf"; // ошибка
R.8.4.3 Ссылки
Переменная, описанная как T&, т.е. "ссылка на тип T" (§R.8.2.2), должна инициализироваться объектом типа T или объектом, который можно преобразовать к типу T, например,
>void f()
>{
> int i;
> int& r = i; // `r' ссылается на `i'
> r = 1; // `i' принимает значение 1
> int* p = &r; // `p' указывает на `i'
> int& rr = r; // `rr' ссылается на то, на что ссылалось `r',
> // т.е. на `i'
>};
Ссылку после инициализации нельзя изменять так, чтобы она обозначала другой объект. Отметим, что инициализация ссылки трактуется совсем не так, как присваивание ссылке. Передача параметра (§R.5.2.2) и операция возврата значения функции (§R.6.6.3) считаются инициализацией.
Инициализатор для ссылки можно опускать только в описании параметра (§R.8.2.5), в описании возвращаемого функцией типа, в описании члена класса при описании самого класса (§R.9.2) и там, где явно использована спецификация extern, например,
>int& r1; // ошибка: нет инициализации
>extern int& r2; // нормально
Если инициализатор для ссылки на тип T является адресом типа T или типом, производным от T (§R.10), для которого T служит доступным базовым типом (§R.4.6), ссылка будет обозначать значение, заданное инициализатором. Иначе, в том и только том случае, когда ссылка обозначает объект со спецификацией const, будет создан объект типа T и проинициализирован значением, заданным инициализатором.
Теперь ссылка играет роль имени этого объекта, например,
>double d = 1.0;
>double& rd = d; // rd ссылается на `d'
>const double& rcd = d; // rcd ссылается на `d'
>double& rd2 = 1; // ошибка: несоответствие типа
>const double& rcd2 = 1; // rcd2 ссылается на временный объект
> // со значением `1'
Ссылку на volatile T можно инициализировать объектом типа volatile T или просто T, но не const T. Ссылку на const T можно инициализировать const T, просто T или чем-то, что можно преобразовать в тип T, но не volatile T. Ссылку на тип T (без const или volatile) можно инициализировать только объектом типа T.