考虑
// 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);
}
我本来希望对static_pointer_cast
的非限定调用解析为std::static_pointer_cast
,因为b
作为std::shared_ptr
,应该使用ADL引入namespace std
。
为什么不呢?我需要显式地编写std::shared_pointer_cast
以使其工作。
https://en.cppreference.com/w/cpp/language/adl
尽管函数调用可以通过ADL解析,即使普通查找一无所获,但对具有明确指定模板参数的函数模板的函数调用需要有通过普通查找找到的模板的声明(否则,遇到未知名称后面跟着小于字符是语法错误((直到C++20(
在C++20模式下,您的代码编译良好,演示:https://gcc.godbolt.org/z/b13q4hs68