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