gpt4 book ai didi

c++ - const 成员函数中模板成员的常量

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:23:41 28 4
gpt4 key购买 nike

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

class TcpSocket;

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

TcpSocket* TcpThread::Listener() const
{
auto s = sockets_.front();
return s;
}

我添加了 auto 来阐明发生了什么。它被推导出为 TcpSocket*,因此正在选择 front 的非 const 版本。但是,如果我插入

sockets_.erase(sockets_.begin());

作为第一行代码,它编译失败,本质上说 sockets_const

它按原样工作是有意义的,但显然这里发生的不仅仅是“将每个成员视为 const 成员函数中的 const

最佳答案

Listener 中的

sockets_const。让我们看看 front 返回了什么:

reference front();
const_reference front() const;

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

这是您的期望不正确的地方。为了清楚起见,去掉引用,您期望一个 const TcpSocket*,它给您一个 TcpSocket * const。前者是指向 const TcpSocket 的指针,后者是指向 TcpSocketconst 指针。

那么 front 给你的是一个指针,你不能将它更改为你可以更改的 TcpSocket

因此,制作此指针的非常量拷贝及其指针对象可用于修改是完全有效的:

auto s = sockets_.front();
//sockets_.front() returns TcpSocket* const
//s copies it to a TcpSocket*

关于c++ - const 成员函数中模板成员的常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34995258/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com