Вчера я был (приятно) удивлен, когда смог скомпилировать код с методом, использующим используя псевдоним типа, даже несмотря на то, что объявление псевдонима появилось позже в определении класса.
- Допустимо ли это «прямое» использование псевдонима типа? (Я предполагаю, что это так, поскольку 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;
}