为什么"static_pointer_cast"不适用于 ADL,但需要显式的"std::"?



考虑

// 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

相关内容

  • 没有找到相关文章

最新更新