[英]Check if object declared const
如果對象被聲明為const,我想打破編譯。
以下不起作用:
#include <type_traits>
struct A {
A() : v(0)
{
static_assert( ! std::is_const<decltype(*this)>::value, "declared as const" );
}
int& AccessValue() const
{
return const_cast< int& >( v );
}
int v;
};
int main()
{
A a1; // ok, this compiles
const A a2; // no, this break the compilation
a1.AccessValue() = 5; // ok
a2.AccessValue() = 6; // OPS
}
那么,如果這種類型的對象被聲明為const,有沒有辦法打破編譯?
你走錯了路。
該類型的this
純粹是在你使用它的方法的簽名dictacted。 也就是說, this
總是cv T* const
類型,其中cv
對應於方法的CV限定符。
因此,在構造函數中, this
只是T* const
。
const_cast
是一個代碼的氣味,通常只使用與交易時const
-broken傳統的圖書館...或(有時),以避免違反干。 在新代碼中,您不必使用它。
你有一個選擇:
AccessValue
非const,因為它不是 i
是mutable
。 我建議選擇以前的解決方案。 放棄private
屬性的句柄已經很糟糕(打破封裝),也不需要違反const
正確性。
對於您的具體示例,使i
變為可變將實現您的目標:
int& AccessValue() const
{
return v;
}
mutable int v;
這來自§7.1.6.1/ 4 [dcl.type.cv]:
除了可以修改聲明為mutable(7.1.1)的任何類成員之外,任何在其生命周期內修改const對象的嘗試(3.8)都會導致未定義的行為。
請注意,不能使用const對象上的指向成員的方法修改v
- n3290 draft [expr.mptr.oper]的§5.5/ 5:
[注意:不可能使用指向成員的指針來引用可變成員來修改const類對象。 例如,
struct S {
S() : i(0) { }
mutable int i;
};
void f()
{
const S cs;
int S::* pm = &S::i; // pm refers to mutable member S::i
cs.*pm = 88; // ill-formed: cs is a const object
}
- 結束說明]
你可以有多個變量引用同一個對象,一些是可變的,一些是const。 例如:
A a1;
const A &a2 = a1;
A * const pa = &a1;
f(a1);
....
void f(const A &a);
你的情況應該允許這些嗎? 從mutable到const的轉換是隱含的,反之亦然。 也許如果你舉一個例子會有所幫助。
編輯:(響應修改后的代碼)與const對象,您只能調用const成員函數。 為什么沒有:
int& AccessValue()
{
return v;
}
如果在非const對象上調用AccessValue,則為抱怨的編譯器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.