今天我发现可以在带有一个签名的标头中声明一个函数,并在具有不同(相似)签名的源文件中实现它。例如,像这样:
// 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)?
修改 我正在编写迂腐和最大可能的警告级别,我仍然没有收到警告或错误。
答案 0 :(得分:12)
为了确定函数签名,忽略任何顶级 const
限定符。这是因为它不会影响函数调用者。函数参数在任何情况下都按值传递,因此函数不会影响传入的参数。
顶级const
会影响函数体。它确定是否可以在函数体中更改参数。它与声明的功能相同。
所以是的,这是合法的,声明和定义指的是相同的功能,而不是过载。
标准参考:8.3.5 [dcl.fct] / 3:“[...]函数的类型使用以下规则确定。[...]任何 cv-qualifier 删除修改参数类型。[...]这样的 cv-qualifiers 仅影响函数体内参数的定义;它们不影响函数类型。[... ]“
答案 1 :(得分:5)
由于 int 是基本值类型,因此const修饰符在此处没有任何效果。无论你对函数中的int做了什么,调用者都不会看到它。
您无法使用 int& 执行此操作。在这种情况下,const的存在与否实际上与调用者相关,因为可以修改引用的。