首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么std::string没有C++11中的const * cast操作符?

为什么std::string没有C++11中的const * cast操作符?
EN

Stack Overflow用户
提问于 2014-07-30 14:28:42
回答 2查看 1.4K关注 0票数 5

在C++03中,对于std::string类,c_str()data()方法有不同的行为。

第一个返回一个以空结尾的字符数组,最后一个数组的管理完全依赖于实现。实际上,c_str()可以返回指向另一个预分配缓冲区的指针,该缓冲区总是包含一个以空结尾的字符串,但这不是强制性的。然而,复杂性必须是恒定的。

第二个简单返回指向std::string内部缓冲区的指针,该指针可以为空终止,也可以为空终止。

因此,在C++03中,您可以猜到const char*的cast运算符不是一个好主意。实际上,大多数情况下,预期的行为是有一个以空结尾的C样式字符串,但是,由于c_str()的实现可能不同,cast操作符后面可能存在隐藏的开销。在另一种情况下,如果cast操作符返回与data()相同的结果,则可能会造成混淆。

然而,对于C++11,c_str()data()具有相同的行为。c_str()返回指向std::string对象内部缓冲区的指针。const char*的cast运算符不再是模棱两可的了。为什么此方法不存在于std::string类中的C++11中?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2014-07-30 14:37:03

您的问题从根本上讲是关于设计string类的哲学。我只能认为。

为什么string应该有一个const char*的cast操作符?Cast运算符是其他操作的语法糖,只有在不寻常的情况下才真正需要。真的,他们从来不需要--你总是可以用另一种方式实现同样的目标。

string已经提供了通过c_strdata与旧C风格接口交互的方法。在混合中添加一个强制转换操作符并不会增加功能,而且会增加类的复杂性。此外,使用cast运算符在语义上总是很模糊。在调用站点代码中,像使用static_cast <const char*>这样的强制转换通常需要编译时操作。通过通过运行时代码执行此强制转换,可以将代码歧义化。不太清楚。因为期望和现实是不一样的,所以比编译时更容易误用这个运行时强制转换。

我认为,在不真正需要的地方不应该有隐式转换操作符;而且它不在这里。

票数 3
EN

Stack Overflow用户

发布于 2014-07-30 14:44:40

这些更改的主要原因是线程安全,特别是避免使迭代器和引用无效。要使这种情况发生,需要空终止缓冲区。

可以阅读更多关于N2534提案的内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25048019

复制
相关文章
套接字Socket编程
Socket,原意插座、插口。写软件程序时,可以想象成一根网线,一头插在客户端,一头插在服务端,然后进行通信。所以通信前,双方都要建立一个Socket。
JavaEdge
2021/12/07
1.3K0
套接字Socket编程
Socket - 套接字编程
目录 Socket - 套接字编程 Socket 通信流程图 Socket模块 socket()方法 部分参数 bind()方法 listen()方法 accept()方法 accept()函数返回值:sock、addr connect() 方法 close()方法 服务端客户端对比 简单案例 简易通信循环 优化通信循环 黏包问题 Struct 模块 规定报头 解决黏包问题 上传文件案例 UDP通信 Socket - 套接字编程 只要涉及到远程数据交互必须要操作OSI七层模型,那么每层都需要相应的程序
HammerZe
2022/03/25
1K0
Socket - 套接字编程
套接字Socket编程
Socket,原意插座、插口。写软件程序时,可以想象成一根网线,一头插在客户端,一头插在服务端,然后进行通信。所以通信前,双方都要建立一个Socket。
JavaEdge
2021/10/18
1.4K0
套接字
版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.net/zy010101/article/details/88673990
zy010101
2019/05/25
1.3K0
网络编程套接字(一)
IP地址(公网IP)是用来唯一标识互联网中的一台主机,一台主机一个IP。而IP分源IP和目的IP,源IP和目的IP对一个报文来讲,是起从哪里来,到哪里去的作用,其最大的意义是指导报文该如何进行路径的选择,而路径中,每一个“站点”就是MAC地址的变化。
二肥是只大懒蓝猫
2023/04/09
7580
网络编程套接字(一)
Python Socket套接字编程
网络技术是从1990年代中期发展起来的新技术,它把互联网上分散的资源融为有机整体,实现资源的全面共享和有机协作,使人们能够透明地使用资源的整体能力并按需获取信息,资源包括高性能计算机、存储资源、数据资源、信息资源、知识资源、专家资源、大型数据库、网络、传感器等.
微软技术分享
2022/12/28
1.3K0
套接字选项
选项影响套接字操作,如 封包路由,OOB数据传输,获取和设置套接字选项分别是 getsockopt  setsockopt 用法如下: int getsockopt(SOCKET s,int level,int optname,char* optval,int* optlen); int setsockopt(SOCKET s,int level,int optname,char* optval,int* optlen); 每个协议层套接字的选项有不同的级别: 应用层:SOL_SOCKET 传输层:IPPR
用户1154259
2018/01/17
1.2K0
Socket(套接字)
TCP/IP只是一个协议栈,Socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create,listen,accept,connect,read和write等等。
老马的编程之旅
2022/06/22
1.3K0
Python套接字
Python只支持AF_UNIX(基于文件)、AF_NETLINK(使用标准的BSD套接字接口进行用户级别和内核级别代码之间的IPC)、AF_TIPC(透明的进程间通信)、AF_INET(基于网络)家族。
用户4845306
2019/03/14
1.6K0
Java网络编程--套接字Socket
一、套接字Socket IP地址标志Internet上的计算机,端口号标志正在计算机上运行的进程(程序)。 端口号被规定为一个16位的0--65535之间的整数,其中,0--1023被预先定义的服务通信占用。 当两个程序需要通信时,可以通过Socket类建立套接字对象并连接在一起。(端口号与IP地址的组合得出的一个网络套接字) 二、示例 (1)客户端服务器端一对一;聊天 1 package mychat; 2 3 import java.io.BufferedReader; 4 import ja
听着music睡
2018/05/18
1.6K0
JavaTCP和UDP套接字编程
原文地址:http://www.cnblogs.com/MindMrWang/p/8919890.html 在我们刚开始入门Java后端的时候可能你会觉得有点复杂,包含了很多杂七杂八的知识,例如文件上传下载,监听器,JDBC,请求重定向,请求转发等等(当然也没有很多),但是我们自己真正的去开发一个小型网站(对安全性一起其他并发不作要求)的时候,其实我们会发现,Java后端是真的省事,好像除了CURD还是CURD,没有什么更新鲜的了。但是我们回顾计算机网络的知识提出疑问,计算机信息传输有TCP和UDP两种连接方式,但是我们编程的时候怎么没体现?怎么回事呢?
MindMrWang
2018/09/29
5000
JavaTCP和UDP套接字编程
Java套接字
  本文补充一下Java关于套接字方面的内容,因为其应用相对比较简单,所以下面介绍两个程序实例。
云海谷天
2022/08/09
7710
Java套接字
Linux网络-套接字编程基础
Linux网络编程套接字 零、前言 一、网络基础知识 1、源IP地址和目的IP地址 2、源MAC地址和目的MAC地址 3、认识端口号 4、PORT VS PID 5、TCP和UDP协议 6、网络字节序 二、socket编程接口 1、sockaddr结构 2、socket 常见API 零、前言 本章就Linux网络编程进行概念及接口学习,下一篇则是简单的进行上手网络套接字编程 一、网络基础知识 1、源IP地址和目的IP地址 在数据传输时各网络协议栈会对数据进行报头封装,而在IP数据包头部中, 有两个IP
用户9645905
2022/11/15
1.5K0
Linux网络-套接字编程基础
原始套接字 IP_HDRINCL 转
原始套接字可以访问ICMP和ICMP等协议包,可以读写内核不处理的IP数据包。可以创建自定义的IP数据包首部。一句话,使用原始套接字可以   编写基于IP协议的通讯程序。   1.创建原始套接字具体格式如下:int sockfd;sockfd = socktet(AF_INET, SOCK_RAW, IPPROTO_ICMP);第一个参数:协议族 AF_INET 代表TCP/IP协议第二个参数:SOCKET类型第三个参数:协议类型注意:@如果指定协议为0时,原始套接字可以接收内核传递给原始套接字
战神伽罗
2019/08/30
2.4K0
14.1 Socket 套接字编程入门
Winsock是Windows操作系统上的套接字API,用于在网络上进行数据通信。套接字通信是一种允许应用程序在计算机网络上进行实时数据交换的技术。通过使用Windows提供的API,应用程序可以创建一个套接字来进行数据通信。这个套接字可以绑定到一个端口,以允许其他应用程序连接它。另外,Winsock可以使用TCP/IP、UDP等协议来完成不同类型的数据传输任务。在网络应用程序开发中,套接字通信可以帮助应用程序开发者实现客户端/服务端模型,并实现数据的可靠传输。
微软技术分享
2023/10/11
4110
14.1 Socket 套接字编程入门
unix网络编程——TCP套接字编程
  TCP客户端和服务端所需的基本套接字。服务器先启动,之后的某个时刻客户端启动并试图连接到服务器。之后客户端向服务器发送请求,服务器处理请求,并给客户端一个响应。该过程一直持续下去,直到客户端关闭,给服务端发送EOF(文件结束),服务器也关闭连接的服务器端,然后结束运行或者等待新的客户发起连接请求
Mister24
2018/09/19
1.2K0
unix网络编程——TCP套接字编程
16(套接字)
套接字描述符在Unix系统中是用文件描述符实现的。事实上,许多处理文件描述符函数(read和write)都可以处理文件描述符 要创建一个套接字,可以调用socket函数
提莫队长
2019/02/21
9830
Linux网络-TCP/UDP套接字编程
注:由于UDP不是面向连接的,所以传输数据时需要指明对端网络相关的信息,即sendto的最后两个参数用来表示对端的信息
用户9645905
2022/11/15
3.7K0
Linux网络-TCP/UDP套接字编程
JavaTCP和UDP套接字编程
原文地址:http://www.cnblogs.com/MindMrWang/p/8919890.html 在我们刚开始入门Java后端的时候可能你会觉得有点复杂,包含了很多杂七杂八的知识,例如文件上传下载,监听器,JDBC,请求重定向,请求转发等等(当然也没有很多),但是我们自己真正的去开发一个小型网站(对安全性一起其他并发不作要求)的时候,其实我们会发现,Java后端是真的省事,好像除了CURD还是CURD,没有什么更新鲜的了。但是我们回顾计算机网络的知识提出疑问,计算机信息传输有TCP和UDP两种连
MindMrWang
2018/04/24
7070
JavaTCP和UDP套接字编程
Socket 套接字协议
A network socket is an internal endpoint for sending or receiving data within a node on a computer network. Concretely, it is a representation of this endpoint in networking software (protocol stack), such as an entry in a table (listing communication protocol, destination, status, etc.), and is a form of system resource.
vanguard
2020/03/18
1.5K0

相似问题

Visual错误:已经添加了具有相同键的项

48

获取错误"app.UseBlazor“,原因是”已经添加了具有相同键的项“

16

LinqToSql --已经添加了具有相同键的项。

24

字典:已经添加了具有相同键的项

20

错误-已经添加了一个具有相同键的项。

113
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文