Где неопределенное поведение при использовании const_cast <>? - PullRequest
7 голосов
/ 04 апреля 2011

Если я это сделаю:

const char* const_str = "Some string";

char* str = const_cast<char*>(const_str); // (1)

str[0] = "P"; // (2)

Где (какая строка) точно является неопределенным поведением?

Я много искал это на SO, но не нашел ни одногоявный и точный ответ (или, по крайней мере, ни один, который я мог бы понять).

Также связано: если я использую внешнюю библиотеку, которая предоставляет такой тип функции:

// The documentation states that str will never be modified, just read.
void read_string(char* str);

Это нормально?написать что-то вроде:

std::string str = "My string";

read_string(const_cast<char*>(str.c_str()));

Поскольку я точно знаю, что read_string() будет никогда попытаться написать str?

Спасибо.

Ответы [ 2 ]

9 голосов
/ 04 апреля 2011

Строка (2) имеет неопределенное поведение. Компилятор может поместить константы в постоянную память (когда-то в Windows это был бы «сегмент данных»), поэтому запись в него может привести к завершению вашей программы. Или нет.

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

0 голосов
/ 04 апреля 2011

Вы пытаетесь изменить постоянную строку, которую компилятор мог поместить в раздел процесса, доступный только для чтения. Это лучше:

char str[32];
strcpy(str, "Some string");
str[0] = "P";
...