Забавный вопрос об идентификаторах
Малому в универе досталась задача — написать компилируемую программу, в которой должен использоваться как можно в больших ипостасях, так сказать, один и тот же идентификатор. Но именно разных, так что какое-нибудь вложенное
namespace a { namespace a { namespace a {
ничего нового по сравнению с одним пространством имен не дает.
Поскольку малой уже сочинил и отправил
namespace a
{
struct a
{
int a;
};
int a()
{
struct a a {0};
return a.a;
}
}
int main()
{
int a = a::a();
std::cout << a;
}
считаю себя вправе задать эту задачку как вопрос — кто сможет добиться большего? :)
Ответы (2 шт):
Плюс метка, плюс аргумент функции, плюс атрибут (и даже три разных атрибута, один из которых с аргументом (!) ), плюс определение препроцессора:
#define a a
namespace a {
struct a {
int a;
};
int a(int a) {
goto a;
a:
if (a) {
return a;
} else {
struct a [[std::a, a::a(a), a]] a {0};
return a.a;
}
}
}
int main() {
int a = a::a(0);
std::cout << a;
return 0;
}
Вопрос: другие идентификаторы допустимы? Или нужен только один?
Если допустимы, то вот развитие ответа Stanislav Volodarskiy:
template<typename a>
a aa(int*) {
return a{};
};
namespace a {
struct a {
int a;
};
int a(struct a a) {
goto a;
a:
if (a.a) return a.a;
else {
struct a a {0};
return a.a;
}
}
}
int main() {
int a = a::a(aa<struct a::a>(&a));
std::cout << a;
return 0;
}