Определение функции с другой подписью - PullRequest
5 голосов
/ 18 ноября 2010

Сегодня я обнаружил, что можно объявить функцию в заголовке с одной подписью и реализовать ее в исходном файле с другой (похожей) подписью. Например, вот так:

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

EDIT Я компилирую с педантичным и максимально возможным уровнем предупреждения, но все еще не получаю предупреждение или ошибку.

Ответы [ 2 ]

12 голосов
/ 18 ноября 2010

В целях определения сигнатуры функции любой квалификатор top level const игнорируется. Это связано с тем, что это не влияет на вызывающие функции. В любом случае параметры функции передаются по значению, поэтому функция не может влиять на передаваемые аргументы.

Верхний уровень const влияет на тело функции. Он определяет, может ли параметр быть изменен в теле функции. Это та же функция, что и при объявлении.

Так что да, это допустимо, и объявление и определение относятся к одной и той же функции, а не к перегрузке.

Стандартная ссылка: 8.3.5 [dcl.fct] / 3: "[...] Тип функции определяется с использованием следующих правил. [...] Любой cv-qualifier изменение типа параметра удаляется. [...] Такие cv-qualifiers влияют только на определение параметра в теле функции; они не влияют на тип функции. [...] "

5 голосов
/ 18 ноября 2010

Поскольку int является базовым типом значения, модификатор const здесь не имеет никакого эффекта.Независимо от того, что вы делаете со своим int в функции, вызывающая сторона никогда не увидит этого.

Вы не можете сделать это с int & .В этом случае наличие или отсутствие const действительно важно для вызывающей стороны, так как int, указанный в , может быть изменен.

...