gpt4 book ai didi

c++ - 初始化 const 对象中的引用

转载 作者:太空狗 更新时间:2023-10-29 23:35:56 25 4
gpt4 key购买 nike

我有以下代码:

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;
}

编译它给出以下错误信息:

tmp.cpp:12:30: error: invalid initialization of reference of type 'int&' from ex
presion of type '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;
}

最佳答案

问题不在于您的对象是 const:而是您试图将一个 const 引用绑定(bind)到一个非常量引用:这是非法的。

您可以将 const 引用绑定(bind)到 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;
}

您仍然可以为 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
};

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

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

编辑:

对于您的 int 参数不是 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';
}

Live demo.

关于c++ - 初始化 const 对象中的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25631135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com