«использующий» псевдоним типа области видимости: [когда] может использовать в методах PRECEDE псевдоним типа? - PullRequest
3 голосов
/ 10 февраля 2020

Вчера я был (приятно) удивлен, когда мне удалось скомпилировать код, у которого был метод, который использовал с использованием псевдонима типа , хотя объявление псевдонима было только позднее в определении класса.

  • Допустимо ли это «прямое» использование псевдонима типа? (Полагаю, так и есть, поскольку Clang 5 и G CC 4.9 оба работают таким образом.)
  • Какие правила охватывают это поведение и разницу между использованием тела метода и сигнатуры метода?

Случай # 1 - использование объявленного после метода, допустимого внутри тела метода (только?)

#include <string>
#include <iostream>

struct X {
  std::string create() {     // fails to compile if Y used in signature
      return Y{"hello!"};    // compiles when Y here
  }

  using Y = std::string;     // declared at bottom
};

int main() 
{
    std::cout << X().create() << std::endl;
}

Случай # 2 - использование объявленного выше [также] допустимо в подписи

#include <string>
#include <iostream>

struct X {
  using Y = std::string;     // declared at top

  Y create() {               // can use Y here as well
      return Y{"hello!"};
  }
};

int main() 
{
    std::cout << X().create() << std::endl;
}

1 Ответ

5 голосов
/ 10 февраля 2020

Это связано с контекстом полного класса . Когда вы находитесь в теле функции-члена, класс считается завершенным и может использовать все, что определено в классе, независимо от того, где в классе он объявлен.

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

...