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.
我认为问题在于子表达式1 { a, a }实际上没有类型,因此它没有关联的类型或命名空间,这反过来意味着ADL没有启动.如果你在全局命名空间中有一个函数,那么正常查找将找到它,它会发现{ a, a }可以匹配函数调用作为初始化程序std::initializer_list<Foo>.
1语法{ a, a }称为braced-init-list,它实际上不是语言中的表达式(或子表达式).
| 归档时间: |
|
| 查看次数: |
165 次 |
| 最近记录: |