C++ 为什么可以';我不能声明对可变对象的引用吗?(“引用不能声明为可变的”)

C++ 为什么可以';我不能声明对可变对象的引用吗?(“引用不能声明为可变的”),c++,reference,C++,Reference,假设我们有一个测试.cpp,如下所示: class A; class B { private: A mutable& _a; }; 汇编: $> gcc test.cpp test.cpp:6:20: error: reference ‘_a’ cannot be declared ‘mutable’ [-fpermissive] 我的gcc: $> gcc --version gcc (Ubuntu/Linaro 4.6.1-9ubuntu3)

假设我们有一个
测试.cpp
,如下所示:

class A;

class B
{
    private:
        A mutable& _a;
};
汇编:

$> gcc test.cpp
test.cpp:6:20: error: reference ‘_a’ cannot be declared ‘mutable’ [-fpermissive]
我的gcc:

$> gcc --version
gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

为什么?

引用只能在构造对象时指定,之后不能修改。因此,使它们成为可更改的将没有任何意义,这就是标准不允许它的原因。

根据标准: [7.1.1第8段]:

“可变说明符只能应用于类数据的名称 成员(9.2),且不能应用于声明为常量或静态的名称, 并且不能应用于引用成员。“


所以这是非法的。

没有理由让引用成员可变。为什么?因为常量成员函数可以更改类成员引用的对象:

class B {
public:
    B(int var) : n(var) {};
    void Set(int val) const { n = val; }  //no error
    void SetMember(int val) const { m = val; }  //error assignment of member `B::m' in read-only structure
protected:
    int& n;
    int m;
};

这可能会让你大吃一惊,但引用永远是不可变的(不能用来引用另一个对象),引用的值总是可变的(除非你有一个对const的引用):

#包括
结构A
{
int&i;
A(int&n):i(n){}
void公司()常数
{
++一,;
}
};
int main()
{
int n=0;
常数A(n);
a、 公司();

STD::CUT你在寻找指针吗?即使你可以这样做也没用,因为C++没有任何可以改变引用的语法。你甚至不能得到引用的内存地址。如果你尝试得到引用指向的对象的地址。对不起,我问错了问题。这不是一个可变的引用。,这是对可变对象的引用!(我更改了标题)但引用可以是常量或非常量。因此
可变a&a
应该可以,不是吗?(现在不靠近编译器。)但在这种情况下,
可变
适用于引用的对象,而不是引用。
#include <iostream>

struct A
{
  int& i;
  A(int& n): i(n) {}
  void inc() const 
  {
    ++i;
  }
};

int main()
{
  int n = 0;
  const A a(n);
  a.inc();
  std::cout << n << '\n';
}