Допустимо ли в C ++ использование typedef в объявлении метода, но канонического типа в определении метода? - PullRequest
3 голосов
/ 25 августа 2009

GNU C ++ (g ++ -pedantic -Wall) принимает это:

typedef int MyInt;

class Test
{
public:
    MyInt foo();
    void bar(MyInt baz);
}; 

int Test::foo()
{
    return 10;
}

void Test::bar(int baz)
{
}

int main(void)
{
    Test t;
    t.bar(t.foo());
    return 0;
}

Законно ли C ++? Другие компиляторы могут принять это?

Ответы [ 3 ]

10 голосов
/ 25 августа 2009

Да, это законно:

7.1.3 Спецификатор определения типа

Имя, объявленное с помощью typedef спецификатор становится typedef-именем. В рамках своей декларации, typedef-имя синтаксически эквивалент ключевому слову и именует тип, связанный с идентификатором в способ, описанный в пункте 8. А typedef-name, таким образом, является синонимом другой тип. typedef-имя не вводит новый тип как класс декларация (9.1) или перечисление enum делает.

7 голосов
/ 25 августа 2009

Независимо от того, является ли это законным, это не лучшая практика. Существуют определения типов, так что вы можете изменить базовый тип и отразить его во всем коде, и если вы когда-нибудь это сделаете, вы обнаружите, что ваша программа больше не компилируется.

1 голос
/ 25 августа 2009

Да, это законно.

Это сомнительно, поскольку уже не очевидно, как соотносятся декларация и определение, но если у вас есть веская причина, вы можете это сделать.

...