代码之家  ›  专栏  ›  技术社区  ›  BЈовић

定义具有不同签名的函数

  •  5
  • BЈовић  · 技术社区  · 14 年前

    今天,我发现可以用一个签名在头中声明一个函数,并用不同的(类似的)签名在源文件中实现它。例如,如下所示:

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

    编辑 我正在用学究式的和尽可能大的警告级别编译,我仍然没有得到警告或错误。

    2 回复  |  直到 14 年前
        1
  •  12
  •   BenMorel Sonaten    10 年前

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

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

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

    标准参考:8.3.5[dcl.fct]/3:“[…]函数的类型是使用以下规则确定的。[…]任何 简历限定符 修改参数类型将被删除。[…]如此 简历限定词 仅影响函数体中参数的定义;它们不影响函数类型。[...]"

        2
  •  5
  •   Daniel Daranas    14 年前

    自从 内景 是基本值类型,const修饰符在这里没有任何效果。无论在函数中对int做什么,调用方都不会看到它。

    你不能这样做 内部; . 在这种情况下,const的存在或不存在对调用者来说确实很重要,因为 所指的int 可以修改。