定义具有不同签名的函数

时间:2010-11-18 08:36:28

标签: c++ language-lawyer

今天我发现可以在带有一个签名的标头中声明一个函数,并在具有不同(相似)签名的源文件中实现它。例如,像这样:

// THE HEADER  example.hpp

#ifndef EXAMPLE_HPP
#define EXAMPLE_HPP

int foo( const int v );

#endif

// THE SOURCE FILE example.cpp

#include "example.hpp"

int foo( int v )   // missing const
{
  return ++v;
}

这是允许的吗?或者这是编译器的扩展(我使用的是g ++ 4.3.0)?

修改 我正在编写迂腐和最大可能的警告级别,我仍然没有收到警告或错误。

2 个答案:

答案 0 :(得分:12)

为了确定函数签名,忽略任何顶级 const限定符。这是因为它不会影响函数调用者。函数参数在任何情况下都按值传递,因此函数不会影响传入的参数。

顶级const会影响函数体。它确定是否可以在函数体中更改参数。它与声明的功能相同。

所以是的,这是合法的,声明和定义指的是相同的功能,而不是过载。

标准参考:8.3.5 [dcl.fct] / 3:“[...]函数的类型使用以下规则确定。[...]任何 cv-qualifier 删除修改参数类型。[...]这样的 cv-qualifiers 仅影响函数体内参数的定义;它们不影响函数类型。[... ]“

答案 1 :(得分:5)

由于 int 是基本值类型,因此const修饰符在此处没有任何效果。无论你对函数中的int做了什么,调用者都不会看到它。

您无法使用 int& 执行此操作。在这种情况下,const的存在与否实际上与调用者相关,因为可以修改引用的