函数重定义:const 参数

sam*_*sam 3 c++ copy-constructor redefinition

1. 在全局范围内,这给出error: redefinition of 'f'

#include <iostream> 
using namespace std; 
  
void f(int x) { cout << "f" << endl; }
void f(const int x) { cout << "f (const)" << endl; } // error: redefinition of 'f'
int main() { } 
Run Code Online (Sandbox Code Playgroud)

2. 定义两个复制构造函数(一个带const,另一个不带)编译

#include <iostream> 
using namespace std; 
  
class Foo { 
public: 
    Foo(const Foo&) { cout << "copy (const)" << endl; }
    Foo(Foo&) { cout << "copy" << endl; }
}; 

int main() { } 
Run Code Online (Sandbox Code Playgroud)

问题

  1. 为什么 #1 是重新定义错误,而 #2 不是?
  2. const对于第二个示例,是否存在定义两个复制构造函数(一个有另一个没有)的用例?

Hol*_*Cat 5

const在检查两个函数是否相同时,仅忽略参数的顶层属性。

“顶级”常量是什么意思?这意味着某些东西实际上是 const,正如 所报道的那样std::is_const_v

例如int *const是 顶级 const (因为指针本身是const),并且const int *不是(因为指针本身不是const,即使它指向的是const)。

某些东西可以在多个级别上是 const ,例如const int *const

const int在顶层也是 const,因为这里只有一个“级别”。

如果有多个星号(例如),则仅当位于最右边的星号之后int ***时,该类型才是顶级 const 。const


所以,const int是顶层const,含义const intint顶层constness不同而已。

但是 ( 类似于const int *)const Foo&不是 const 位于顶层。这是对 的非常量引用const Foo。(引用永远不能是 const 1,例如Foo &const无法编译。)

Foo &所以和之间的区别const Foo &不在顶层,使得Foo(Foo &)Foo(const Foo &)不同的构造函数。


1有些人认为所有引用都是有效的const,因为在创建它们后您无法使它们指向不同的对象。但语言说它们不是const,并std::is_const_v为它们返回 false 。