Withdecltype
とstd::is_const
変数の constness は、外部から検出できます。しかし、オブジェクトが自身の constness を知ることも可能でしょうか? 使用法は次のようにする必要があります。
#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 の場合、おそらく最適化された描画ルーチンを使用できますが、基になるデータが非 const の場合、描画ルーチンはデータが更新されたかどうかを定期的に確認する必要があります。
注: 関連する質問では、const オブジェクトのビルドを中断する方法を尋ねていますが、その答えが私の質問に対して明確な NO を意味するかどうかはよくわかりません。そうでない場合は、さらに使用するために boolean で constness をキャプチャしたいと考えています。
編集:@DanielFreyが指摘したように、コンストラクターはconstnessをテストするのに適した場所ではありません。const メンバー関数はどうですか?
更新: 私の最初の不適切な質問を修正し、回答のさまざまな部分を提供してくれた皆さんに感謝します (コンストラクターの不明確な constness、 の rvaluedness this
、 の文脈上の意味const
、-後知恵で-私が見落としていた明らかな過負荷のトリック、および影に潜む const 参照のエイリアシングの抜け穴)。私にとって、この質問は最高の Stackoverflow でした。@JonathanWakelyの回答を選択することにしました。これは、constness の概念を強化する定義Mutable
とクラスを定義して、私が望むものを誰にでもできる方法で達成する方法を示したからです。Immutable