2013-07-02 3 views
3

Мне нужны некоторые предопределенные константные строковые литералы c-style в моем коде на C++.Применить const_cast к строковому литералу?

Могу ли я использовать const_cast<char *> непосредственно в строковом литерале?

I.E., является ли это законным (и это хорошая идея) для обычной ожидающей аргумента char* только для чтения?

const_cast<char*>("PIOFLAG") 

Или я просто использовать char *pf="PIOFLAG" и использовать pf в качестве аргумента?

+0

Вы намерены изменить эти строки? Если это так, вы не можете полагаться на литерал для записи. –

+0

Нет, мне не нужно его изменять, просто прочитайте. Но API имеет 'char *', а не 'const char *' –

+0

Не можете ли вы использовать встроенные массивы? 'char pf [] =" PIOFLAG ";'. – mfontanini

ответ

4

Если строка используется в API, которая принимает char *, но на самом деле не модифицирует сама строку, то const_cast<char *>("SOME STRING") будет в порядке. В идеале, вы изменили бы API, чтобы вместо него иметь параметр const, что сделает его намного проще в использовании и отразит реальность.

+0

Не мой API для изменения ... –

+0

@AndrewJaffe: Итак, отправьте отчет об ошибке. Вы * наверняка *, что он не будет пытаться изменить строку? –

0

Ни то, ни другое. Вы просто создаете еще один char * с собственным распределением памяти и копируете в него строку.

Отказаться от конструированности объекта const, а его модификация в конечном итоге дает вам неопределенное поведение, поэтому на самом деле это не очень хорошая идея. Даже если вы не планируете модифицировать объект, это еще не очень хорошая идея, потому что вы побеждаете всю цель const-корректности и подвергаете свой код капризам и фантазиям других, а также самих себя.

char *pf="PIOFLAG"; 

Это использование устаревший в C++, Вы должны использовать const char * при объявлении строкового литерала.

+0

Слишком сложно использовать: чтобы решить, как удалить выделенную память, вы должны понять, как ее использует API (что может быть сложным и зависящим от реализации). Если вы выполняете кастинг, достаточно знать, что API не меняет его. – anatolyg

+0

@anatolyg: Простой ответ на ваше возражение: это зависит. В OP недостаточно информации для принятия решения. –

0

Вы можете const_cast строковый литерал таким образом, но не нуждаетесь в этом, так как существует неявное преобразование в char * (то есть depreceted).

Однако вам не разрешено изменять строку через этот указатель.

Смежные вопросы