Константы по умолчанию компонуются внутренним образом. Это означает, что при объявлении константы нет необходимости указывать атрибут static, чтобы сделать ее локальной в модуле. Поэтому в разных модулях можно объявлять глобальные константы с одинаковыми именами — конфликта при компоновке не происходит. Более того, чтобы сделать константу, объявленную в одном модуле, видимой в другом, нужно использовать слово extern:
// модуль А.срр extern const int а = 2: // модуль В.срр extern const int а:
Тогда компоновщик будет считать, что в модулях А.срр и В.срр используется одна и та же целая константа с именем а. Если мы пропустим слово extern в объявлении константы в модуле А.срр, то получим локализованную константу и при обработке объявления в модуле В.срр компоновщик выдаст сообщение о неопределенном имени.
Внутренняя компоновка констант оказывает «медвежью услугу» в шаблонах. Поскольку строковые литералы — это объекты со свойством внутренней компоновки, использовать их в качестве аргумента шаблона не разрешается:
template<char const *str> class Template { ... };
Template<"literal"> T; // Ошибка!
Нельзя использовать и глобальный указатель:
template<char const *str>
class Template { ... };
char const *s = "Literal":
Template<s> T; // Ошибка!
Если у вас отключили интернет то подключить новый вы всегда можете тут - http://nwlk.ru/.
Однако глобальный символьный массив использовать можно:
template<char const *str> class Template { ... }; char const s[] = "Literal";
Template<s> T; // Ошибки нет!
|