С 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 в const-объекте или исходит из неконстантного объекта. Объект может, например, представляют кэш, а член - представление. Если кеш был const, можно было бы использовать оптимизированную процедуру рисования, тогда как если базовые данные были неконстантными, процедура рисования должна была бы периодически проверять, были ли данные обновлены.
ПРИМЕЧАНИЕ: связанный с этим вопрос ) спрашивает, как разбить сборку для объектов const, но я не совсем понимаю, если ответ на что подразумевает определенный НЕТ для моего вопроса. Если нет, я хочу зафиксировать константу в булевом для дальнейшего использования.
EDIT: как было указано @DanielFrey, конструктор не является хорошим местом для тестирования на константу. Как насчет функции-члена const?
ОБНОВЛЕНИЕ. Спасибо всем за исправление моего изначально некорректного вопроса и предоставление различных частей ответа (неопределенная константа конструкторов, rvaluedness of this
, контекстуальный смысл const
, с ретроспективным взглядом - очевидным перегрузочным трюком, который я упустил, и лазейкой с псевдонимом const, скрывающимся в тени). Для меня этот вопрос был Stackoverflow в лучшем виде. Я решил выбрать @JonathanWakely ответ, потому что он показал, как определить классы Mutable
и Immutable
, которые укрепляют концепцию константы, чтобы достичь того, что я хочу в надежном виде.