Забавный вопрос об идентификаторах

Малому в универе досталась задача — написать компилируемую программу, в которой должен использоваться как можно в больших ипостасях, так сказать, один и тот же идентификатор. Но именно разных, так что какое-нибудь вложенное

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 шт):

Автор решения: Stanislav Volodarskiy

Плюс метка, плюс аргумент функции, плюс атрибут (и даже три разных атрибута, один из которых с аргументом (!) ), плюс определение препроцессора:

#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;
}
→ Ссылка
Автор решения: Mikhailo

Вопрос: другие идентификаторы допустимы? Или нужен только один?

Если допустимы, то вот развитие ответа 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;
    }
→ Ссылка