5

C++ コンパイラは、「const bool &」の値が変更されないと想定できますか?

たとえば、次のクラスがあるとします。

class test {
public:
  test(const bool &state)
    : _test(state) {
  }

  void doSomething() {
    if (_test) {
      doMore();
    }
  }
  void doMore();

private:
  const bool &_test;
};

そして、私はそれを次のように使用します:

void example() {
  bool myState = true;
  test myTest(myState);

  while (someTest()) {
    myTest.doSomething();
    myState = anotherTest();
  }
}

_test の値が変更されないとコンパイラが想定することは、標準で許可されていますか。

私はそうは思いませんが、ただ確信したいだけです。

4

3 に答える 3

7

いいえ。あなたの参照 (またはポインター) が であるconstからといって、他の誰かが非const参照を持つことを止めることはできません。このような:

int main(void) {
  bool myState = true;
  test myTest(myState);
  std::cout << myTest.getState() << std::endl;
  myState = false;
  std::cout << myTest.getState() << std::endl;
}

またはもっと簡単に:

bool a = true;
const bool& b = a;
a = false; // OK
b = true; // error: assignment of read-only reference ‘b’
于 2011-02-26T17:52:38.967 に答える
5

const Type & r「の値は、この参照rでは変更できない」ことを意味しますが、参照された値に直接アクセスできる他のコードによって (または非 const 参照またはポインターを介して) 変更される可能性があります。同じことが次の場合にも当てはまりますconst Type * pp

于 2011-02-26T17:52:29.513 に答える
3

そうです、の参照先の値は、コンパイル時に利用できない_testの実装で変更される可能性があるため、それを想定することはできません。doMoreこの場合myStateは const オブジェクトではないため、(たとえば) doMoreconst をキャストして変更することは有効です。有効ですが、お勧めできません ;-)

また、一般にdoMore、同じオブジェクトへの他のポインター/参照を持つ関数をbool別のルートで呼び出す可能性があります。あなたの例では、他の参照は行われていないためコンパイラがそれを参照する可能性のあるすべてのコード ( の定義を含むdoMore) を確認でき、いずれも値を変更しない場合仮定を行うことができます。

于 2011-02-26T17:56:08.573 に答える