Я пытаюсь использовать 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;
}
Как видно выше, эквивалентная глобальная функция работает нормально. Почему вышеуказанное не работает?
Я использую clang для OS X 10.10.
Вы определяете реализацию друга внутри класса. Он должен быть снаружи, см. [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