c++ - 为什么在这种情况下编译器会选择错误的重载?
问题描述
考虑这个相当简单的代码(godbolt):
#include <cstddef>
#include <string>
using namespace std;
string f(char const* fmt, ...);
size_t f(char* buf, size_t sz, char const* fmt, ...);
void bar()
{
f("%c%s", 'A', "AAA");
}
第一个参数的类型应该是char const[5]
,这意味着甚至不应该考虑第二个重载。然而编译器(即使它有点抱怨)选择了它(正如您在生成的程序集中看到的那样)。
有人可以准确解释这里发生了什么吗?
笔记:
- MSVC 无法编译这个
- 我的 GCC 版本 8.3.1-3 也无法编译
解决方案
推荐阅读
- javascript - 幻灯片效果很奇怪
- android - 如何修复listview值单个字符串对android有多个值
- android - 我的Android App 支持7.0 及以上版本,但不支持6 和5
- python - 尝试使用 pandas_datareader 从列表中创建数据框
- c - C - 将数据写入文件,要么全部写入,要么不写入
- php - 在 PHP 中,当类不存在时,为什么 \Foo\Bar::class 不会产生错误?
- d3.js - 是否可以将行图的 x 比例更改为 sqrt?
- elasticsearch - 使用 Vega-lite 在 Kibana 中分组条形图
- python - 从文件中读取有向图
- python - Python 从 csv 问题中绘制图形