Я хотел бы прервать компиляцию, если объект объявлен константным.
Не работает следующее:
#include <type_traits>
struct A {
A() : v(0)
{
static_assert( ! std::is_const<decltype(*this)>::value, "declared as const" );
}
int& AccessValue() const
{
return const_cast< int& >( v );
}
int v;
};
int main()
{
A a1; // ok, this compiles
const A a2; // no, this break the compilation
a1.AccessValue() = 5; // ok
a2.AccessValue() = 6; // OPS
}
Итак, есть ли способ прервать компиляцию, если объект этого типа объявлен константным?
const A
, но не должен, компилятор в конечном итоге выдаст ошибки, в основном говорящие о том же (объявленном как const), поэтому вам действительно не нужно проверять такие вещи. - person Shahbaz   schedule 27.03.2012const_cast
. - person Konrad Rudolph   schedule 27.03.2012const_cast
. То есть лучше задать следующие вопросы: зачем вам нуженconst_cast
? Как можно избежать использованияconst_cast
? - person David Rodríguez - dribeas   schedule 27.03.2012i
mutable не дало бы того, чего вы хотите, без актерского состава? - person Mat   schedule 27.03.2012AccessTheValue()
UB или нет. РЕДАКТИРОВАТЬ: Нашел [dcl.type.cv]/4, что можно изменить переменную метода, объявленную как изменяемую. Спасибо - person BЈовић   schedule 27.03.2012Mat
, это не UB, еслиi
этоmutable
. - person Matthieu M.   schedule 27.03.2012