簡體   English   中英

檢查對象是否聲明為const

[英]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,因為它不是
  • 宣稱imutable

我建議選擇以前的解決方案。 放棄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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM