可以从外部检测变量的和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 对象的构建,但我不太明白这个问题的答案是否意味着我的问题的明确否定。如果没有,我想在布尔值中捕获常量以供进一步使用。
编辑:正如@DanielFrey 所指出的,构造函数不是测试常量的好地方。那么 const 成员函数呢?
更新:感谢大家纠正我最初提出的问题并提供答案的各个部分(构造函数定义不明确的常量,右值this
,的上下文含义const
,后见之明 - 我忽略的明显过载技巧,以及潜伏在阴影中的 const 参考别名漏洞)。对我来说,这个问题是最好的 Stackoverflow。我决定选择@JonathanWakely 的答案,因为它展示了如何定义Mutable
和Immutable
加强 constness 概念的类,以一种万无一失的方式实现我想要的。