今天我发现可以在头文件中用一个签名声明一个函数,并在源文件中用不同(相似)的签名实现它。例如,像这样:
// 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)?
编辑 我正在使用迂腐和最大可能的警告级别进行编译,但我仍然没有收到警告或错误。
最佳答案
为了确定函数签名,任何顶级 const
限定符都将被忽略。这是因为它不影响函数调用者。函数参数在任何情况下都是按值传递的,因此函数不会影响传入的参数。
顶层 const
确实会影响函数体。它确定参数是否可以在函数体中更改。不过,它与声明的功能相同。
所以是的,这是合法的,声明和定义指的是同一个函数而不是重载。
标准引用:8.3.5 [dcl.fct]/3:“[...]函数的类型使用以下规则确定。[...]任何cv-qualifier 修改参数类型被删除。[...] 这样的 cv-qualifiers 只影响函数体内参数的定义;它们不影响函数类型。[... ]”
关于c++ - 定义具有不同签名的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4212932/