Why doesn’t `static_pointer_cast` work with ADL, but requires explicit `std::`?

Consider

// https://godbolt.org/z/z5M9b9jzx
#include <memory>
#include <cassert>

struct B {};
struct D : B {};

int main() {
    std::shared_ptr<B> b = std::make_shared<D>();
    auto d = static_pointer_cast<D>(b);
    assert(d);
}

I’d’ve expected the unqualified call to static_pointer_cast to resolve to std::static_pointer_cast, because b, being a std::shared_ptr, should bring namespace std in using ADL.

Why doesn’t it? I need to write std::shared_pointer_cast explicitly to make it work.

Source: Windows Questions C++

LEAVE A COMMENT