繁体   English   中英

重载决策中的const指针

[英]const pointers in overload resolution

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

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

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

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

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

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

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

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

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

void foo(int *const a);

函数类型为void (int *)

一个迂腐的人可能会争辩说这不足以说明上述声明应该像这个定义那样匹配

void foo(int *a)
{
}

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

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

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

我认为这基本上是禁止的:

void foo(int a) {}
void foo(const int a) {}

非引用的const不参与重载。

事实上,你甚至可以宣布

void foo(int a);

然后定义

void foo(const int a) {}

其中constness纯粹是调用者不关心的实现细节。

它与以下相同:

void foo(int);
void foo(const int);

与来电者一样。 这是因为函数无论如何都会获得副本值,因此调用者不关心它是否被认为是const ; 它没有任何区别。

编译器忽略这些事情是合法的,但重载决策没有区别。 const适用于函数的实现。

如果编译器处理了非法的话:

void foo(int i)
{
    i = 5; // good
}

void foo(const int)
{
    i = 5; // lolwut?
}

同样,忽略了const

我相信这是另一种方式。 任何指针,甚至是nonconst,都可以像const :)一样对待。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM