Смотрю последний абзац ответа и что-то не понимаю: почему адрес массива известен на момент компиляции, а не линковки (так же как для строкового литерала)?
Так всё же во время линковки, а не компиляции! Ну и получается тогда, что строковый литерал тоже мог бы использоваться. Ну или хотя бы указатель, который на него указывает.
во-первых есть абсолютная адресация, и относительная. если используется относительная, то в бинарнике не будет абсолютных адресов - будут смещения например от IP
и абсолютные адреса будут вычисляться в ран-тайме
во-вторых, абсолютные адреса в бинарнике на диске не совпадают с адресами в памяти
.
....
во время компиляции нам известен один адрес - адрес плейсхолдера в объектнике во время линковки нам известен другой адрес - адрес в бинарнике во время исполнения будет реальный адрес в памяти
Это всё хорошо, но не отражает ситуацию, почему `s` подходит как аргумент для шаблона, а `p` - нет: `char s[] = "text"; const char* p = "text"; template <const char*> class C {};`
в объектнике будет `mov eax, 666` и в таблице внешних ссылок 666: массив_a в слинкованном бинарнике будет `mov eax, 400777h` в памяти будет `mov eax, 3000777h`
и вот когда мы пишем extern int a[]; X<&a> , то в объектнике в параметр шаблона будет равен 666, и т.д.
пусть вычисляется, но в линктайме могло бы использоваться то же самое, что используется и для массива в шаблоне. Пусть это будет не адрес рантайма, но он тем не менее есть (может быть, если бы разрешили использовать p в шаблоне).
@NicolasChabanovsky можно ли как-то получить RSS популярных и новых вопросов по метке? Т.е. примерно то, что публикуется в твиттер, но с фильтрацией по метке.
[c++] or [visual-c++] or [c++builder] or [c++11] or [c++-cli] or [c++14] or [c++-faq] or [devc++] or [c++17] or [borland-c++] or [c++builder-xe] or [vc++2015] or [c++98]