C++ 是否允许函数参数常量不匹配?

C++ 是否允许函数参数常量不匹配?,c++,macos,abi,name-mangling,C++,Macos,Abi,Name Mangling,关于这一点,我听说在一些OSX系统上,参数的常量被破坏成函数签名。例如,如果在接口头文件中有以下声明: int f(int argument); 但如果只实现这一功能: int f(int const argument); 这可能导致OS X(但不是Linux)上的链接失败,因为OS X方式对C++函数签名的破坏包括参数的稳定性。 哪一种是正确的损坏行为?C++标准对此有发言权吗?< P>顶级名称const和挥发性限定符应该被忽略,用于名称的修改。这可以从标准中的两个方面来确定。首先,函数的

关于这一点,我听说在一些OSX系统上,参数的常量被破坏成函数签名。例如,如果在接口头文件中有以下声明:

int f(int argument);
但如果只实现这一功能:

int f(int const argument);
<>这可能导致OS X(但不是Linux)上的链接失败,因为OS X方式对C++函数签名的破坏包括参数的稳定性。
哪一种是正确的损坏行为?C++标准对此有发言权吗?

< P>顶级名称const和挥发性限定符应该被忽略,用于名称的修改。这可以从标准中的两个方面来确定。首先,函数的签名用于名称损坏

在C++14标准中,第1.3.17节定义了签名:

名称、参数类型列表(8.3.5)和封闭名称空间(如果有)[注意:签名用作名称篡改和链接的基础。-结束注意]

要获得参数类型列表的定义,请参阅第8.3.5/5节:

函数的类型使用以下规则确定。每个参数的类型 (包括函数参数包)由其自身的decl说明符seq和声明符确定。之后 在确定每个参数的类型时,任何类型为“T数组”或“函数返回T”的参数都是 分别调整为“指向T的指针”或“指向返回T的函数的指针”。在制作列表之后 在参数类型中,任何修改参数类型的顶级cv限定符在形成 功能类型。转换参数类型的结果列表以及省略号的存在与否 或者函数参数包是函数的参数类型列表。[注意:此转换不存在 影响参数的类型。例如,int()(const int p,decltype(p))和int()(int, 常量int)是相同的类型。-结束注释]


intf(int常量参数)
是相当多余的,但是如果你坚持认为它有意义的话。出于兴趣,你从哪里听说的?如果这是真的,这将是非常不正确的。正确的行为是忽略顶级的
const
,这意味着应用于参数本身的
const
(与参数引用的内容相反)。例如,
int*const
int*
是相同的,但是
int*const*
int*
是不同的。很难相信OS X会有一个错误的编译器(它是C++的一个基本的部分,自从OSX存在很久以前就已经知道了)。@奥利弗查尔斯沃斯大约2年前,一些同事注意到一些代码不连接OS X,因为这样的错配,因此我一直试图避免这种情况。我记不清他们使用了什么样的工具链。@jotik听起来不太可能。你能复制它吗?