【发布时间】:2013-03-07 19:00:03
【问题描述】:
使用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 上的输出这可能吗?
MOTIVATION:我希望能够检测 const 成员函数是在 const 对象上调用还是来自非常量对象。该对象可以例如表示缓存,成员表示视图。如果缓存是 const 的,可能会使用优化的绘制例程,而如果底层数据是非常量的,则绘制例程需要定期检查数据是否被刷新。
注意:相关的 question 询问如何破坏 const 对象的构建,但我不太明白这个答案是否意味着我的问题的明确否定。如果没有,我想在布尔值中捕获常量以供进一步使用。
编辑:正如@DanielFrey 指出的那样,构造函数不是测试常量的好地方。 const 成员函数呢?
更新:感谢大家纠正我最初提出的问题并提供答案的各个部分(构造函数定义不明确的常量,this 的右值,@987654327 的上下文含义@,事后看来,我忽略了明显的重载技巧,以及潜伏在阴影中的 const 引用别名漏洞)。对我来说,这个问题是最好的 Stackoverflow。我决定选择 @JonathanWakely 的答案,因为它展示了如何定义 Mutable 和 Immutable 类来加强 constness 概念,从而以万无一失的方式实现我想要的。
【问题讨论】:
-
这似乎很哲学。
-
@Richard 因此标签为“反思”(因为缺乏“冥想”)
-
@rhalbersma 我看到 C++ 标记与反射混合在一起,想知道你为什么在一个问题中混合 C++ 和 C#!
标签: c++ reflection c++11 typetraits const-correctness