initializer_list和依赖于参数的查找

Joe*_*oel 4 c++ initializer-list argument-dependent-lookup c++11

我试图在使用参数依赖查找(ADL)的函数中使用std :: initializer_list作为参数.但是我没有让它工作,我不明白为什么.以下是最小的失败示例:

    #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;
    }
Run Code Online (Sandbox Code Playgroud)

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

我在OS X 10.10上使用了clang.

Dav*_*eas 8

我认为问题在于子表达式1 { a, a }实际上没有类型,因此它没有关联的类型或命名空间,这反过来意味着ADL没有启动.如果你在全局命名空间中有一个函数,那么正常查找将找到它,它会发现{ a, a }可以匹配函数调用作为初始化程序std::initializer_list<Foo>.

1语法{ a, a }称为braced-init-list,它实际上不是语言中的表达式(或子表达式).

  • 作为一个注释,`auto`有一个例外,其中推导出`std :: initializer_list`.`auto param = {a,a}; bar(param);`作品. (3认同)