我想使用std :: initializer_list作为使用参数依赖查找(ADL)的函数中的参数。但我没有得到它的工作,我不明白为什么。以下是最小的失败示例: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;
}
如上所示,等效的全局函数工作得很好。为什么上述不起作用?
我在OS X 10.10上使用了clang。
您正在定义类中的朋友实现。它需要在外面,请参阅[this](http://stackoverflow.com/a/7785963/2297365)。这是一个[工作示例](http://coliru.stacked-crooked.com/a/b8fd514c67458c99)。 – huu
@huu:这是不相关的,如果将类型和函数移动到名称空间,您会注意到ADL不会找到它们,无论该函数是在类内还是外部定义的。 –
'template std :: initializer_list il(std :: initializer_list x){return x;} '是一个有点危险的解决方法。 'bar(il({a,a}))'起作用。危险因为支持数组的寿命问题。 –
Yakk