重载决策中的const指针

Dan*_*son 5 c++ standards

GCC将这两个函数声明视为等效:

void F(int* a) { }
void F(int* const a) { }
Run Code Online (Sandbox Code Playgroud)

test.cpp:在函数'void F(int*)'中:

test.cpp:235:错误:重新定义'void F(int*)'

test.cpp:234:错误:'void F(int*)'在此处定义

这有一定意义,因为在这种情况下调用者总是会忽略const ...它只会影响函数内部参数'a'的使用.

我想知道的是标准在哪里(如果有的话)说,为了重载解析的目的,丢弃用作函数参数的指针的限定符是特别好的.

(我真正的问题是我想弄清楚GCC在内部剥离这些毫无意义的限定符的地方,并且由于GCC的C++前端充斥着引用标准的注释,标准的相关部分可能帮助我找到正确的位置. )

AnT*_*AnT 4

标准在 8.3.5/3 中规定,为了确定函数类型,任何直接限定参数类型的 cv 限定符都将被删除。即它的字面意思是一个函数声明为

void foo(int *const a);
Run Code Online (Sandbox Code Playgroud)

具有函数类型void (int *).

迂腐的人可能会争辩说,这还不足以断言上述声明应该与这样的定义相匹配

void foo(int *a)
{
}
Run Code Online (Sandbox Code Playgroud)

或者它应该使具有双重声明的代码(如您的示例中所示)格式错误,因为标准中没有以函数类型来描述这些概念。

我的意思是,我们都知道这些const是为了所有外部目的而被忽略的,但到目前为止我无法在标准中找到能够最终准确地说明这一点的措辞。也许我错过了什么。

实际上,在 13.1/3 中,它有一个“注释”,表示具有等效参数声明(如 8.3.5 中定义)的函数声明声明相同的函数。但这只是一个注释,它是非规范性的,这表明标准中的某个地方应该有一些关于同一问题的规范性文本。