为什么没有命名空间限定符的std :: generate是可访问的?

时间:2016-04-04 14:56:11

标签: c++ c++11 gcc namespaces clang

编译正常是否正常?

#include <vector>
#include <algorithm>

int main()
{
    std::vector<int> buf;
    generate(buf.begin(), buf.end(), []{ return 0; });
}

(请注意std::)前面缺少的generate()

这种行为是否记录在某处?或者我偶然发现了编译器或库错误?在我的例子中,在Linux上是GCC 5.3.0和Clang 3.8.0;两者都使用libstdc ++,所以也许库bug?

1 个答案:

答案 0 :(得分:3)

这是允许的,主要是因为generate的参数位于std

代码

namespace Foo
{
    struct B{};
    void foo(const B&);
}

int main()
{
    Foo::B b; /*Requires Foo::*/
    foo(b); /*Does not require Foo:: as that is gleaned from the argument*/
}
出于类似的原因,

是可以接受的。我们称之为参数依赖查找。见https://en.wikipedia.org/wiki/Argument-dependent_name_lookup