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 次 |
最近记录: |