【问题标题】:Defining a function with different signature定义具有不同签名的函数
【发布时间】:2011-05-11 21:46:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ language-lawyer


    【解决方案1】:

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

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

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

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

    【讨论】:

    • +1 表示“顶级 const 限定符”。你再清楚不过了。
    • 太棒了。那段甚至回答了我的问题。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多