Неопределенное поведение по отношению к const_cast
определяется стандартом C ++ 11 §3.8 / 9 (§3.8 - время жизни объекта):
Создание нового объекта в том месте хранения, которое занимает объект const
со статической, потоковой или автоматической продолжительностью хранения, или в месте хранения, которое такой const
объект занимал до окончания срока его существования, приводит к неопределенному поведение.
и §7.1.6.1 / 4 (§7.1.6.1 - это cv-квалификаторы)
За исключением того, что любой член класса, объявленный mutable
(7.1.1), может быть изменен, любая попытка изменить объект const
в течение его времени жизни (3.8) приводит к неопределенному поведению.
Другими словами, вы получите UB, если измените объект изначально const
, а в противном случае 1 - нет.
Сам const_cast
не вводит UB.
Кроме того, в §5.2.11 / 7 есть ненормативное примечание, что в зависимости от типа запись через указатель или ссылку, полученную от const_cast
, может иметь неопределенное поведение.
Это ненормативное примечание настолько сложное, что в нем есть своя ненормативная сноска, объясняющая, что const_cast
не ограничивается преобразованиями, которые отбрасывают const
-квалификатор.
Однако, по-прежнему с этим разъяснением, я не могу придумать ни одного случая, когда запись могла бы быть четко определенной или не зависеть от типа, то есть я не могу понять это примечание. Два других ответа здесь сосредоточены на слове написать в этой заметке, и это необходимо, чтобы попасть в UB-land через §3.8 / 9, да. Для меня довольно подозрительный аспект - это зависимость от шрифта, который, по-видимому, составляет значительную часть этой ноты.
1) За исключением случаев, когда в игру вступают правила UB, касающиеся других вещей, не связанных с const_cast
, например обнуление указателя, который позже разыменован в контексте, отличном от typeid
-expression.
person
Cheers and hth. - Alf
schedule
26.04.2015