В недавней дискуссии возник вопрос о том, должны ли мы всегда полностью ток имя класса в определении класса, а также использовать явно специализированные шаблоны при обращении к ток сам шаблон. Подвести итог:
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
};
Проблема в том, что никто не мог подкрепить свои утверждения убедительными фактами, это было простопоиск имени может пойти не так» против «Мех, никогда не было никаких проблем».
Для того, чтобы решить это: эти два соглашения строго эквивалентны, или «плохой» может иногда вносить неоднозначности в поиск имени? Ссылки на текущий стандарт были бы очень хорошими.
Конечно, аргумент о разборчивости не должен приниматься во внимание, я действительно спрашиваю о том, как стандартный компилятор будет вести себя в угловых случаях. Тем не менее, известные ошибки реализации также приветствуются.
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
,
Конечно, в случае шаблона они идентичны: компилятор вводит что-то вроде Bar = Bar<T>
в определение класса для вас автоматически.
Кроме того, для первого примера я не вижу, что Foo
может относиться к чему-либо другому, кроме самого локально вложенного Foo
другими словами текущий класс.
Функционально говоря, эти два эквивалента, но я собираюсь доказать, что практически они не являются: в каждом случае, более подробный кажется Сильнее Грок и поддерживать.