использование псевдонима типа области класса: [когда] может ли использование в методах ПРЕДШЕСТВУЕТ псевдониму типа?

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

  • Допустимо ли это «прямое» использование псевдонима типа? (Я предполагаю, что это так, поскольку Clang 5 и GCC 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;
}

person user2864740    schedule 10.02.2020    source источник
comment
Я уверен, что где-то есть обман, но это потому, что тело функции является complete -контекст класса.   -  person Rakete1111    schedule 10.02.2020


Ответы (1)