5

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

// 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)?

编辑 我正在以迂腐和最大可能的警告级别进行编译,但我仍然没有收到警告或错误。

4

2 回答 2

12

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

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

所以是的,它是合法的,声明和定义引用相同的函数而不是重载。

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

于 2010-11-18T08:40:02.113 回答
5

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

你不能用int&做到这一点。在这种情况下, const 的存在与否与调用者真正相关,因为可以修改所引用的 int 。

于 2010-11-18T08:39:01.210 回答