initializer_list和参数依赖性查找

initializer_list and argument-dependent lookup

本文关键字:依赖性 查找 参数 list initializer      更新时间:2023-10-16

我正在尝试将std :: prinistizer_list用作使用参数依赖性查找(ADL)的函数中的参数。但是我不工作,我不明白为什么。以下是一个最小的失败示例:

    #include <initializer_list>
    #include <iostream>
    class Foo {
    public:
      inline friend void bar(std::initializer_list<Foo> v) {
        std::cout << "size = " << v.size() << std::endl;
      }
    };
    void baz(std::initializer_list<Foo> v) {
      std::cout << "size = " << v.size() << std::endl;
    }
    int main(){
      Foo a;
      //bar({a,a});   // error: use of undeclared identifier 'bar'
      baz({a,a});   // works
      return 0;
    }

如上所述,等效的全局函数正常工作。为什么以上不起作用?

我在OS X 10.10上使用Clang。

我相信问题是子表达 1 { a, a }真正没有类型,因此它没有相关的类型或名称空间表示ADL不会启动。如果您在全局名称空间中具有功能,则普通查找会找到它,并且发现{ a, a }可以将函数调用匹配为std::initializer_list<Foo>的初始化器。

1 语法{ a, a }称为 braced-init-list ,它不是语言中真正的表达式(或subxexpression)。

编译器看到bar({a,a})时,它不知道参数的类型,因此它在全局名称空间(::)中搜索bar,而其他任何地方都没有其他地方。如果将该行更改为Foo{a,a},则知道该参数是Foo,因此也将Foo类搜索函数。