Вызывает ли неконстантный mem. веселье. для константного объекта через неконстантную ссылку, полученную через const_castC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Вызывает ли неконстантный mem. веселье. для константного объекта через неконстантную ссылку, полученную через const_cast

Сообщение Anonymous »

Коротко говоря, я спрашиваю, вызывает ли следующий код UB только в том случае, если /* body */ действительно меняет значение i, или также, если это не так, в силу звоню не- MaybeChange функция-член константного объекта.

Код: Выделить всё

// header.hpp
struct Foo {
int i;
void maybeChange();
};

void work(Foo const& foo);

Код: Выделить всё

// foo.cpp
#include "header.hpp"
void Foo::maybeChange() {
/* body */
}

Код: Выделить всё

// work.cpp
#include "header.hpp"
void work(Foo const& foo) {
const_cast(foo).maybeChange();
}

Код: Выделить всё

// main.cpp
#include "header.hpp"
Foo const foo{6};

int main() {
work(foo);
}
Я вижу, что проблема существует в том случае, если модификация действительно имеет место, потому что это нарушает законное предположение, которое может сделать компилятор, т.е. что глобальный объект foo не измениться.
Но, с другой стороны, http://eel.is/c++draft/dcl.type.cv#4 не показывает ни одного примера вызова не- функция-член объекта const, в который const был передан const_cast, но это фактически не изменяет его, как в моем примере выше. Там показаны тривиальные примеры, такие как

Код: Выделить всё

const int* ciq = new const int (3);     // initialized as required
int* iq = const_cast(ciq);        // cast required
*iq = 4;                                // undefined behavior: modifies a const object
где последняя строка действительно изменяет объект *ciq.


Подробнее здесь: https://stackoverflow.com/questions/792 ... tained-via
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»