考虑以下程序:
#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");
}
它产生不同的输出:
我的问题有两个:
为什么字符串文字绑定到非常量char*
即使在存在的情况下-std=c++14
?不是字符串文字const
从 C++11 开始?
省略号重载始终排名最低。 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(使用前将#替换为@)