为何无需std命名空间,holds_alternative仍可编译通过?
关于
holds_alternative无需std::命名空间即可编译的现象 我在多款编译器上测试后发现,以下代码中的holds_alternative即使不添加std::命名空间限定,也能正常编译通过:
#include <variant> int main() { std::variant<int, double> foo = 1; bool wuff = holds_alternative<int>(foo); return 0; }
出现这种情况的核心原因是**依赖于参数的查找(ADL,Argument-Dependent Lookup)**机制:当调用函数时,如果函数的实参属于某个命名空间(此处foo是std::variant类型,归属std命名空间),编译器会自动在该实参所属的命名空间中查找匹配的函数。holds_alternative是<variant>头文件中定义在std命名空间内的函数模板,因此编译器通过ADL可以自动定位到它,无需手动添加std::前缀。
内容的提问来源于stack exchange,提问作者AMG
相关产品推荐
相关产品推荐

