Недавно я столкнулся с проблемой с компилятором clang ++ 5.0.0, где через ADL он не собирал правильную функцию на Mac (но g ++ сделал это правильно в Linux). Я хотел бы знать, является ли его компилятор проблемой или плохой дизайн класса в целом.
Ниже приведен пример кода (чисто для иллюстрации):
Как ADL будет работать для этого?
namespace test {
class Ops {
public:
Ops():val_(0){}
template<typename T>
Ops& operator<< (const T& val) {
std::cout << "Called member function" << std::endl;
this->val_ = val;
return *this;
}
private:
int val_;
};
template<typename T>
struct Any {
T val_;
};
template <template<typename> class E, typename T>
Ops& operator<< (Ops& op, const E<T>& val) {
std::cout << "Global function" << std::endl;
return op;
}
}
int main() {
test::Ops op;
int k = 9;
test::Any<int> a;
op << a;
return 0;
}
Я хотел бы знать, как ADL и аргумент шаблона вычет wouldwork на шаге мудрое, чтобы найти лучший матч?
Будет ли какая-либо ситуация для того же «основного тела», что функция-член предпочтительнее вместо свободной функции? (Это то, что происходит в сборке продукта)
Заранее спасибо.
Спасибо за отличный ответ Марко. Как вы сказали, назначение в func члена может «ошибиться», поэтому другая перегрузка, которая должна срабатывать для желаемого типа. – Arunmu