Поиск имени: обратная сторона использования неквалифицированного имени класса внутри определения класса / без параметров шаблона?

В недавней дискуссии возник вопрос о том, должны ли мы всегда полностью ток имя класса в определении класса, а также использовать явно специализированные шаблоны при обращении к ток сам шаблон. Подвести итог:

namespace foo {
struct Foo {
doSomething(foo::Foo& other); // arguably good
doSomething(Foo& other);      // arguably bad
};
}

template<typename T>
struct Bar {
doSomething(Bar<T>& other); // arguably good
doSomething(Bar& other);    // arguably bad
};

Проблема в том, что никто не мог подкрепить свои утверждения убедительными фактами, это было простопоиск имени может пойти не так» против «Мех, никогда не было никаких проблем».

Для того, чтобы решить это: эти два соглашения строго эквивалентны, или «плохой» может иногда вносить неоднозначности в поиск имени? Ссылки на текущий стандарт были бы очень хорошими.

Конечно, аргумент о разборчивости не должен приниматься во внимание, я действительно спрашиваю о том, как стандартный компилятор будет вести себя в угловых случаях. Тем не менее, известные ошибки реализации также приветствуются.

2

Решение

https://ideone.com/f48mJI

namespace foo {
namespace foo {
typedef int Foo;
}
struct Foo {
int m_foo;
Foo( foo::Foo const& o_foo ):m_foo(o_foo.m_foo) {}
};
}

int main() {
::foo::Foo foo_(::foo::foo::Foo{});
}

В заключение, Foo,

7

Другие решения

Конечно, в случае шаблона они идентичны: компилятор вводит что-то вроде Bar = Bar<T> в определение класса для вас автоматически.

Кроме того, для первого примера я не вижу, что Foo может относиться к чему-либо другому, кроме самого локально вложенного Fooдругими словами текущий класс.

Функционально говоря, эти два эквивалента, но я собираюсь доказать, что практически они не являются: в каждом случае, более подробный кажется Сильнее Грок и поддерживать.

1

По вопросам рекламы [email protected]