Почему шаблонный класс в C ++ не может быть создан с помощью строкового литерала? [Дубликат]

Попробуйте следующее:

DECLARE @Hobbies NVARCHAR(200) = ' '

SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;
5
задан Bikineev 19 July 2015 в 18:22
поделиться

2 ответа

Массив a является постоянным массивом символов, он полностью инициализируется во время компиляции, а также получает адрес памяти для запоминания компилятором, поэтому он может распадаться на указатель в шаблоне.

Но p является указателем к постоянному массиву символов, но сам указатель не является константой времени компиляции и может быть изменен для указания на другие строки, и это not инициализируется во время компиляции, но либо во время соединения (что происходит после компиляции), либо когда программа загружается в память. Адрес p известен во время компиляции, но не адрес строкового литерала p указывает на.


Чтобы развернуть по причине, что адрес строкового литерала не является известная во время компиляции, потому что она помещается в специальный сегмент для чтения с помощью генератора кода компилятора, и этот сегмент только для чтения затем объединяется с сегментами только для чтения из других блоков перевода при связывании. Вот почему окончательный адрес строкового литерала не может быть известен до момента связывания (как можно раньше).

10
ответ дан Some programmer dude 31 August 2018 в 16:25
поделиться

Это может помочь понять, почему A<p>{}; не допускается, если вы предполагаете, что p инициализируется некоторой функцией

const char* p = getP();

, где getP() определяет ее результат по некоторым данным времени выполнения, для например, путем чтения конфигурационного файла.

0
ответ дан bjhend 31 August 2018 в 16:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: