const成员函数中模板成员的常量

ana*_*ect 5 c++ templates const function member

如何const应用于const成员函数中的模板成员?我发现以下内容很有趣(这是在VS15中):

class TcpSocket;

class TcpThread
{
   TcpSocket* Listener() const;
   std::vector< TcpSocket* > sockets_;
};

TcpSocket* TcpThread::Listener() const
{
   auto s = sockets_.front();
   return s;
}
Run Code Online (Sandbox Code Playgroud)

我补充auto说明了发生了什么.它被推断为TcpSocket*,因此选择了非const版本front.但是,如果我插入

sockets_.erase(sockets_.begin());
Run Code Online (Sandbox Code Playgroud)

作为第一行代码,就无法编译,本质上说,sockets_const.

这是有道理的,它为它的工作,但显然比单纯"对待每一个成员作为这里发生了const一个const成员函数.

Tar*_*ama 3

sockets_里面Listenerconst. 让我们看看front返回了什么:

reference front();
const_reference front() const;
Run Code Online (Sandbox Code Playgroud)

所以我们会得到一个const_reference,在本例中是一个TcpSocket * const&

这就是你的期望不正确的地方。为了清楚起见,去掉参考,你期望一个const TcpSocket*,它给你一个TcpSocket * const。前者是指向 a 的指针const TcpSocket,后者是const指向 a 的指针TcpSocket

因此,front给您的是一个无法更改为TcpSocket可以更改指针。

因此,制作此指针的非常量副本及其可修改的指针是完全有效的:

auto s = sockets_.front();
//sockets_.front() returns TcpSocket* const
//s copies it to a TcpSocket*
Run Code Online (Sandbox Code Playgroud)