初始化const对象中的引用

jay*_*jay 2 c++ constructor const constants

我有以下代码:

class c_int {
public:
  int &i;
  c_int(int &in) : i(in) {
  };
  c_int(const int &in) : i(in) {
  };
};


int main (void) {

  const int i = 10;
  const c_int c(i); 

  std::cout << c.i << std::endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译它会给出以下错误消息:

tmp.cpp:12:30: error: invalid initialization of reference of type 'int&' from ex
presion of type 'const int'
Run Code Online (Sandbox Code Playgroud)

我遇到了一些麻烦,弄清楚如何让它工作,我应该如何初始化const对象内的引用?

编辑:理想情况下,我希望这个对象也用于非常量的int; 当对象未声明为const时.

进一步编辑:

我也希望使用这样的对象:

int main (void) {

  int i = 10;
  c_int c(i); // for some reason this calls the 2nd of my constructors, does name mangling not take const into account?
  c.i = 9;    

  std::cout << i << std::endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

qua*_*dev 6

问题不在于你的对象是const:你试图将const引用绑定到非const引用:这是非法的.

您可以将const引用绑定到const成员:

class c_int {
public:
  const int &j;
  c_int(const int &in) : j(in){  };
};


int main (void) {

  const int i = 10;
  c_int c(i); 

  std::cout << c.j << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

您仍然可以使用两种不同的类constnon const对象,或者如果你真的需要一个单独的类,知道自己在做什么,用一个const_cast(真的气馁:任何试图修改的对象将是未定义的行为):

class c_int {
public:
  int& i;
  c_int(int& in) : i(in){ }
  c_int(const int& in) : i(const_cast<int&>(in)){ } // Very wrong
};
Run Code Online (Sandbox Code Playgroud)

或者,忘记通过引用传递和使用值语义:

class c_int {
public:
  int i;
  c_int(int in) : i(in){ }
};
Run Code Online (Sandbox Code Playgroud)

编辑:

对于int参数不是const的情况,您仍然可以添加一个非const引用的构造函数:

class c_int {
public:
  const int &j;
  c_int(const int &in) : j(in){  };
  c_int(int &in) : j(in){ }
};


int main (void) {

  const int i = 10;
  const c_int c(i); 
  std::cout << c.j << '\n';

  int i2 = 11;
  const c_int d(i2); 
  std::cout << d.j << '\n';  
}
Run Code Online (Sandbox Code Playgroud)

现场演示.