On Fri, 21 Oct 2005 13:58:53 +0400, Pavel Chikulaev <39728@users.rsdn.ru> wrote:
> Кстати а зачем лишний нэймспейс is_left_shiftable_ и в бусте например noncopyable_ ?
namespace noncopyable_ // protection from unintended ADL
Здравствуйте, Pavel Chikulaev, Вы писали:
PC>Здравствуйте, MaximE, Вы писали:
>>> Кстати а зачем лишний нэймспейс is_left_shiftable_ и в бусте например noncopyable_ ?
ME>>
ME>>namespace noncopyable_ // protection from unintended ADL
ME>>
PC>А подробнее? что такое ADL я знаю Но все-таки?
Посмотри как работает ADL в этом случае:
#include <iostream>
// Попробуй скомпилировать как есть, а потом расккоментировав следующую строку
//#define PROTECT_FROM_ADL 1namespace nm {
#ifdef PROTECT_FROM_ADL
namespace A_ {
#endif
struct A
{
};
#ifdef PROTECT_FROM_ADL
}
using A_::A;
#endif
template <typename T>
void f(const T &) {}
}
struct B: public nm::A
{
};
int main()
{
B b;
f(b);
}
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re[5]: traits: is_istreamable, is_ostreamable
От:
Аноним
Дата:
22.10.05 17:59
Оценка:
Здравствуйте, Pavel Chikulaev, Вы писали: > что такое ADL я знаю
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Pavel Chikulaev, Вы писали: >> что такое ADL я знаю
А>Я не знаю, может расскажеш
Argument-dependent lookup, он же Koenig lookup (поиск идентификаторов им. А.Кёнига, поиск в зависимости от аргументов).
Когда компилятор встречает вызов функции с неквалифицированным именем, например foo(x,y,z) а не SomeNS::foo(x,y,z) — он пытается отыскать её
— в текущем scope, начиная от самого узкого (например, среди методов класса, из метода которого она вызвана) вплоть до глобального пространства имён
— в пространствах имён, к которым принадлежат типы аргументов этого вызова.
Последнее и называется ADL.
Например, инфиксная запись оператора — x+y (сравни с функциональной: operator+(x,y)) это всегда неквалифицированное имя. В этом случае будут рассмотрены глобальное пространство и пространства, в которых определены типы x и y.
Здравствуйте, crable, Вы писали:
>>>> Кстати а зачем лишний нэймспейс is_left_shiftable_ и в бусте например noncopyable_ ?
ME>>>namespace noncopyable_ // protection from unintended ADL
PC>>А подробнее? что такое ADL я знаю Но все-таки? C>Посмотри как работает ADL в этом случае:
Да, интересно. А кроме перестраховочной роли, он там (в is_left_shiftable) пригождается? Как-то отсекает неверные варианты?..
Я что-то не смог придумать, где бы это аукнулось.