字符串文字绑定到非常量字符指针

2024-06-30

考虑以下程序:

#include <iostream>

void myprint(const char* fmt, ...)
{
  std::cout << "1 ";
}

void myprint(const char* fmt, char *x)
{
  std::cout << "2 ";
}

int main()
{
  const char* s = "c";
  myprint("a", s);
  myprint("a", "b");
}

它产生不同的输出:

  • GCC http://rextester.com/FRX58318 and MSVC http://rextester.com/RAGTP26923: 1 2

  • clang http://rextester.com/IUS58046: 1 1

我的问题有两个:

  1. 为什么字符串文字绑定到非常量char*即使在存在的情况下-std=c++14?不是字符串文字const从 C++11 开始?

  2. 省略号重载始终排名最低。 clang 为什么选择它? (有人会认为它不允许绑定到char*但如果我删除省略号过载,它仍然会 -demo http://rextester.com/LALIF98887)

到底发生了什么事,谁是对的?


为什么字符串文字绑定到非常量char*即使在存在的情况下-std=c++14?

这是一个已弃用的转换,从 C++11 开始已从标准中正式删除。

不是字符串文字const从 C++11 开始?

不,字符串文字现在是并且一直是const.

省略号重载始终排名最低。 clang 为什么选择它?

因为另一项无效。没有转换自const char* to char*,出于同样的原因,没有办法转换 aconst std::string& to a std::string&.

因此,重载解析会跳过该重载并选择唯一剩余的重载(这也恰好是有效的),并打印1.

有人会认为它不允许绑定到 char* 但如果我删除省略号重载,它仍然允许

是的,这是一个非标准扩展,就像 gcc 一样。你应该尝试编译-pedantic.

到底发生了什么事,谁是对的?

clang 绝对是对的。不允许扩展修改格式良好的 C++ 程序的行为([合规简介]p8 http://eel.is/c++draft/intro.compliance#8),因此 gcc 和 MSVC 使用第二个重载是错误的,因为标准不支持从const char* to char*,因此应该依靠第一个。

重申一下,您的演示符合标准,因为该程序根据标准(字符串转换)格式不正确,并且它们发出诊断,因此它不会与上面链接的段落相冲突。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字符串文字绑定到非常量字符指针 的相关文章

  • C# 泛型方法,new() 构造函数约束中的类型参数

    有没有办法创建一个使用的通用方法new 要求类具有特定类型的构造函数属性的约束 例如 我有以下代码 public T MyGenericMethod
  • 画笔和钢笔使用指南

    制作 GDI 画笔和钢笔有多贵 我应该在添加所需的基础上创建它们并将它们包装在 using 中以便快速处理它们 还是应该创建一个类似于 System Drawing Brushes 类的静态类 IMO 它们足够高效 您通常不应该创建在多个方
  • 选择数据结构

    根据需求使用不同的数据结构 但我如何知道应该使用哪种数据结构 我只是想知道如何选择合适的数据结构 谢谢 此流程图适用于 C 中的 STL 但您可以用 C 实现 STL 容器支持的任何数据结构 列表是一个链接列表 Vector是一个动态数组
  • HTTPS文件下载C#

    我需要下载隐藏在 HTTPS 连接后面的文件 我对下载安全网站后面的文件不熟悉 我尝试使用凭据来解决此问题 但无济于事 据我所知 您需要创建并使用证书来完成此操作 但我没有找到任何示例 任何帮助表示赞赏 这就是我现在所拥有的 WebClie
  • 如何在 c#.net 中将十进制转换为 ASCII?

    谁能帮助我如何使用 C net 将十进制转换为 ASCII 当我在文本框 1 中输入小数时 单击 转换 按钮后 结果将显示在文本框 2 中 我的问题是如何将十进制转换为 ASCII 的代码 这个怎么做 这是我在网上找到的一个简单的解决方案
  • 规避模板专业化

    假设我是某个模板库的用户 CTL 它定义了一个模板 命名为 Hector template
  • 错误:LNK1120:5 个未解析的外部

    我试图在我的帖子中获取有关已安装应用程序的详细信息 而且 我收到以下错误 Code include
  • 当找到路由/url 但未找到其背后的资源时返回什么?

    当路由customer 1存在但customer搜索背后的资源 实体不存在时 我应该返回 404 吗 我的意思是路线存在 或者我应该返回一个 204 无内容 因为我找不到客户 结果为空 微软样本 public IHttpActionResu
  • 浮点指令异常——FLDZ故障?

    I am trying to debug the problem I posted earlier here C and pin tool very weird DOUBLE variable issue with IF statement
  • 泛型类中可空的泛型字段

    我正在尝试做这样的事情 public class MySuperCoolClass
  • 安装 Windows 服务以使用 ServiceAccount.User 在用户凭据下运行,但不提示

    我创建了一个 C Windows 服务及其随附的用于创建安装程序的 Visual Studio 安装项目 它成功安装了该服务 当我从枚举中选择任何值时ServiceAccount除了ServiceAccount User 该服务安装时不会提
  • elmah定制提供商及暴露事件

    我想知道如何创建自定义提供程序来存储错误日志 例如 Windows 事件查看器的提供者 如果到目前为止不可能 我还想知道是否有任何可以覆盖的公开事件 以便我可以注入我的代码 获取异常 做任何我想做的事情 我知道 Global asax 中有
  • 启动离线 ClickOnce 应用程序并等待退出

    我已经部署了 ClickOnce Windows 窗体应用程序 应用程序 A 另一个应用程序 应用程序 B 以文件名作为参数启动应用程序 A 我用这段代码做到这一点 var basePath Environment GetFolderPat
  • 在哪里可以查看 LINQ 源代码?

    我需要编写自己版本的 except 方法 或者至少以某种方式修改 LINQ 方法的工作方式 我正在与大型自定义对象列表进行比较 并且需要将匹配项从列表 A 连接到列表 B 我认为除外哈希表构建是进行比较的最快方法 但该方法只会返回非匹配项
  • 尝试写入事件日志时出错 - 无法打开源“SourceName”的日志。您可能没有写入权限

    目前 我们正在尝试将现有的经典 ASP 页面集成到记录事件日志的新方法中 我们通过调用公开为 COM 对象的 NET 程序集来实现此目的 该程序集实际记录到事件日志中 这一切都正常工作 但是当我们尝试写入事件日志时 我们收到错误 无法打开源
  • C# 我可以访问没有完整限定名称的枚举吗

    我有一个 C 枚举类型 它以非常长的限定名称结尾 例如 DataSet1 ContactLogTypeValues ReminderToFollowupOverdueInvoice 为了便于阅读 如果我可以告诉一个特定的函数只使用名称的最后
  • 反序列化 jQuery 序列化表单

    我正在尝试将表单输入传递到 WebMethod 中并执行某些操作 我用了jQuery 序列化 http api jquery com serialize
  • Sharepoint 客户端 GetFolderByServerRelativeUrl 文件夹修改日期

    我试图在使用 GetFolderByServerRelativeUrl 函数时检索文件夹的 修改日期 和 创建日期 我该怎么做 我只能从中获取relativeUrl 和文件夹名称 下面是我为检索文件夹所做的操作 请帮忙 FolderColl
  • C# 替换 Byte[] 中的字节

    替换字节数组中的某些字节的最佳方法是什么 例如我有bytesFromServer listener Receive ref groupEP 我可以做BitConverter ToString bytesFromServer 将其转换为可读格
  • “auto_ptr”和 STL 容器:编写错误用法的示例

    读完本教程后提出这个问题 http www cprogramming com tutorial auto ptr html http www cprogramming com tutorial auto ptr html 在那里你可以找到以

随机推荐