C++ 如何将常量引用分配给非常量变量?

C++ 如何将常量引用分配给非常量变量?,c++,C++,考虑下面的代码,调用onData回调,然后我将常量引用分配给一个变量。我想了解它是如何工作的。我被告知不能修改常量引用,但在这里,似乎可以通过分配给非常量变量来修改 void onData(const evpp::TCPConnPtr &socket) { evpp::TCPConnPtr connection = socket; } 在实际应用程序中,我将其分配给对象实例的成员变量。简单来说,引用只是被引用对象的别名。当引用为const时,意味着您不能通过该引用修改对象(可以通

考虑下面的代码,调用onData回调,然后我将常量引用分配给一个变量。我想了解它是如何工作的。我被告知不能修改常量引用,但在这里,似乎可以通过分配给非常量变量来修改

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听说过,但实际上从未见过任何人。修好了,谢谢。我现在明白了。不知道是否有办法避免复制,但我不确定在这种情况下应该使用正确的类型…@jeffbRTC
Ptr
suffix建议
TCPConnPtr
只是一个指针,如果是这种情况,您不必担心复制一个副本。你甚至可以通过价值观来传递它,我知道,但从一般意义上说,我只是问我的智力好奇心。