Вызывает ли неконстантный 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

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