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成员函数.
sockets_里面Listener是const. 让我们看看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)
| 归档时间: |
|
| 查看次数: |
193 次 |
| 最近记录: |