c++ - 定义具有不同签名的函数

标签 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)?

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

最佳答案

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

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

所以是的,这是合法的,声明和定义指的是同一个函数而不是重载。

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

关于c++ - 定义具有不同签名的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4212932/

相关文章:

c++ - 如何将两个 double 据类型元素转换为一个点数据类型

C++ 使用模板 boost lexical_cast?

c++ - 修复了带引用的内存布局同步变量

c - !0 在 C89 中保证为 1?

c++ - 是否可以在初始化的函数指针声明中使用 `auto` 关键字作为返回类型?

c++ - "typedef"在类型和别名标准符合之间吗?

c++ - C宏是隐式转换的吗?

c++ - 字符串大小保持为零

c++ - 重载 operator<< operator== 和 operator!=

c++ - 关于 std::tuple 对象上的 std::get() 返回类型的混淆