c++ - 重载决策中的 const 指针

标签 c++ standards

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

void F(int* a) { }
void F(int* const a) { }

test.cpp: In function 'void F(int*)':

test.cpp:235: error: redefinition of 'void F(int*)'

test.cpp:234: error: 'void F(int*)' previously defined here

这是有道理的,因为在这种情况下,调用者将始终忽略常量...它只会影响函数内部参数“a”的使用。

我想知道的是,标准在哪里(如果有的话)表示可以丢弃用作函数参数的指针上的限定符以实现重载解析。

(我真正的问题是,我想弄清楚 GCC 在哪里去除了这些毫无意义的限定符,并且由于 GCC 的 C++ 前端充斥着引用该标准的注释,该标准的相关部分可能会帮助我找到正确的位置。)

最佳答案

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

的函数
void foo(int *const a);

具有函数类型void (int *)

迂腐的人可能会争辩说,这还不足以断言上面的声明应该符合这样的定义

void foo(int *a)
{
}

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

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

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

关于c++ - 重载决策中的 const 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2121525/

相关文章:

c++ - C++ 中的 std::regex 表达式

c - 对于任何类型,使用 const void* 代替 void*

c - C 中的差一错误

ios - 显示缩放 iOS 9 [调整大小]

c++ - C++0x 是否在新特性和标准化过程的重压下崩溃了?

c++ - 如何将 vtkImageData 转换为 cv::Mat?

C++指针返回0值

c++ - undefined reference ...被引用的东西

c++ - < & > 被转换为 > < 等

css - 为什么并非所有 CSS 规则都适用于 HTML 电子邮件?