定义具有不同签名的函数

BЈо*_*вић 5 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

CB *_*ley 12

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

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

所以是的,它是合法的,声明和定义指的是相同的功能而不是重载.

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


Dan*_*nas 5

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

你无法用int&做到这一点.在这种情况下,const的存在与否实际上与调用者相关,因为可以修改所引用的int.