Самый сильный вариант использования для ADL предназначен для подобных случаев.
namespace A
{
struct S {};
S operator+( const S&, const S& );
}
namespace B
{
A::S test()
{
A::S a, b;
return a + b;
}
}
Это также полезно для выбора правильной функции swap
в общем коде, поэтому она должна применяться не только к operator
функции.Это уже довольно сложная часть стандарта, поэтому создание правил, которые в некоторых случаях препятствовали бы его работе, добавило бы дополнительную сложность, какой будет выгода?
Я не могу придумать ни одного изящного способа попроситьэто явно было бы значительно менее многословно, чем прямой вызов функции в другом пространстве имен, и в любом случае это сделало бы выражения более сложными.
Мы думаем, что-то вроде: return [[ use_adl ]] (a + b);
против return A::operator+( a, b );
?