C++ 如何将常量引用分配给非常量变量?
考虑下面的代码,调用onData回调,然后我将常量引用分配给一个变量。我想了解它是如何工作的。我被告知不能修改常量引用,但在这里,似乎可以通过分配给非常量变量来修改C++ 如何将常量引用分配给非常量变量?,c++,C++,考虑下面的代码,调用onData回调,然后我将常量引用分配给一个变量。我想了解它是如何工作的。我被告知不能修改常量引用,但在这里,似乎可以通过分配给非常量变量来修改 void onData(const evpp::TCPConnPtr &socket) { evpp::TCPConnPtr connection = socket; } 在实际应用程序中,我将其分配给对象实例的成员变量。简单来说,引用只是被引用对象的别名。当引用为const时,意味着您不能通过该引用修改对象(可以通
void onData(const evpp::TCPConnPtr &socket) {
evpp::TCPConnPtr connection = socket;
}
在实际应用程序中,我将其分配给对象实例的成员变量。简单来说,引用只是被引用对象的别名。当引用为
const
时,意味着您不能通过该引用修改对象(可以通过其他方式修改对象,这一区别很重要,尤其是在多线程情况下)。复制一个const
引用就像复制被引用的对象:
void onData(const evpp::TCPConnPtr &socket) {
evpp::TCPConnPtr connection = socket;
}
std::string x = "foo";
const std::string& x_const_ref = x; // constant reference to x
// x can be modifed but not via x_const_ref
//x_const_ref = "moo"; // ERROR !
x = "bar"; // OK !
std::string y = x; // y is initialized with a copy of x
std::string z = x_const_ref; // z is initialized with a copy of x
y
和z
都将保存字符串“bar”
,但x
在最后两行中未修改。如果TCPConnPtr
没有奇怪的复制构造函数,那么代码中基本上也会发生这种情况(如果它试图修改socket
,则会出现编译器错误)。为什么不呢?为什么您认为代码会修改socket
?您认为socket
被修改的地方,正如您所知,const引用传递的对象没有被修改:)@maximust\u prime\u is_463035818当前,它不会修改socket。我只是想了解它是如何工作的。。它让人困惑..它类似于constintx=42;int y=x;y=0代码>你不是在分配引用,而是在分配引用对象的值,从常量赋值是可以的。数字让我困惑,因为我有计算障碍。介意用一个std::string
?@jeffbRTC听说过,但实际上从未见过任何人。修好了,谢谢。我现在明白了。不知道是否有办法避免复制,但我不确定在这种情况下应该使用正确的类型…@jeffbRTCPtr
suffix建议TCPConnPtr
只是一个指针,如果是这种情况,您不必担心复制一个副本。你甚至可以通过价值观来传递它,我知道,但从一般意义上说,我只是问我的智力好奇心。