Может ли объект знать свою собственную константность?
С участиемdecltype
а такжеstd::is_const
константность переменной может быть обнаружена извне.Но возможно ли, чтобы объект знал свою собственную постоянство? Использование должно быть как:
#include <type_traits>
#include <iostream>
#include <ios>
struct Test
{
Test() {}
bool print() const
{
// does not work as is explained in https://stackoverflow.com/q/9890218/819272
return std::is_const<decltype(*this)>::value; // <--- what will work??
}
};
int main()
{
Test t;
const Test s;
// external constness test
std::cout << std::boolalpha << std::is_const<decltype(t)>::value << "\n";
std::cout << std::boolalpha << std::is_const<decltype(s)>::value << "\n";
// internal constness test
std::cout << std::boolalpha << t.print() << "\n";
std::cout << std::boolalpha << s.print() << "\n"; // <--- false??
}
Выход наLiveWorkSpace Это как-то возможно?
МОТИВАЦИЯ: Я хочу иметь возможность определить, вызывается ли константная функция-член для константного объекта или исходит от неконстантного объекта. Объект может, например, представлять кеш и член представление. Если бы кэш был константным, можно было бы предположительно использовать оптимизированную процедуру отрисовки, тогда как, если бы лежащие в основе данные были неконстантными, подпрограмма отрисовки должна была бы периодически проверять, обновлялись ли данные.
НОТА: связанныйвопрос спрашивает, как сломать сборку для const объектов, но я не совсем понимаю, подразумевает ли ответ на это определенное НЕТ для моего вопроса. Если нет, я хочу записать константу в логическое значение для дальнейшего использования.
РЕДАКТИРОВАТЬ: как было отмечено @DanielFrey, конструктор не является хорошим местом для проверки на константность. Как насчет функции-члена const?
ОБНОВИТЬСпасибо всем за то, что исправили мой изначально некорректный вопрос и предоставили различные части ответа (плохо определенная константность конструкторов, ценностьthis
контекстное значениеconst
, - задним числом - очевидный трюк с перегрузкой, который я упустил из виду, и константная эталонная лазейка, скрывающаяся в тени). Для меня этот вопрос был Stackoverflow в лучшем виде. Я решил выбрать ответ @ JonathanWakely, потому что он показал, как определитьMutable
а такжеImmutable
классы, которые укрепляют концепцию constness для достижения того, что я хочу, безошибочным способом.