3.4.2 从 n3290 草案中查找依赖于参数的名称

发布于 2024-11-12 04:21:09 字数 335 浏览 2 评论 0原文

ISO 草案 n3290 第 3.4.2 节第 1 段中的一点:

当函数调用中的后缀表达式unqualified-id时,可能会搜索在通常的非限定查找过程中未考虑的其他命名空间,并且在这些命名空间中,可能会找到不可见的名称空间范围友元函数声明。对搜索的这些修改取决于参数的类型(对于模板模板参数,则取决于模板参数的命名空间)。

在这里他们说“这些对搜索的修改取决于参数/模板模板参数/模板参数的命名空间的类型”......任何人都可以用一个例子来解释吗?我尝试使用参数类型..请使用模板模板参数类型进行解释模板参数类型的命名空间

A point from ISO draft n3290 section 3.4.2 paragraph 1:

When the postfix-expression in a function call is an unqualified-id, other namespaces not considered during the usual unqualified lookup may be searched, and in those namespaces, namespace-scope friend function declarations not otherwise visible may be found. These modifications to the search depend on the types of the arguments (and for template template arguments, the namespace of the template argument).

Here they said aboout "these modifications to the search depend on the types of the arguments / template template arguments / namespace of the template argument " ...Can any one expalin with an example please? I tried with argumetn types..please expalin with template template argument types & namespace of the template argument type

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

怕倦 2024-11-19 04:21:09

考虑一个简单的非限定函数调用:

foo(x);

ADL 意味着不仅在封闭范围和调用所在的命名空间中查找 foo,而且还在 x< 类型的命名空间中查找/代码>。例如,如果 xstd::vector,则还会搜索命名空间 std。因此:

int main() {
    std::vector<int> x,y;
    swap(x,y);
}

可以,并且将调用 std::swap() 。

查找还取决于任何模板参数的命名空间,因此如果 xstd::vectormynamespace也包含在查找中。因此

namespace mynamespace {
    struct myclass {};
    void foo(std::vector<mynamespace::myclass> const&){}
}

int main() {
    std::vector<mynamespace::myclass> x;
    foo(x);
}

将调用mynamespace::foo()

最后,查找还扩展到用作模板模板参数的任何模板的名称空间。例如,

namespace mynamespace {
    template<typename T>
    struct mytemplate
    {};

    template<typename T>
    void bar(T const&) {}
}

template<template<typename> class T>
struct wrapper {};

int main() {
    wrapper<mynamespace::mytemplate> x;
    bar(x);
}

即使 wrapper 位于全局命名空间中,也会找到 mynamespace::bar,因为 x 使用的模板模板参数是 mynamespace::mytemplate

Consider a simple unqualified function call:

foo(x);

ADL means that foo is looked up not just in the enclosing scope, and the namespace that the call is in, but also the namespace of the type of x. e.g. if x is a std::vector<int> then namespace std is also searched. Thus:

int main() {
    std::vector<int> x,y;
    swap(x,y);
}

is OK, and will call std::swap().

The lookup also depends on the namespace of any template arguments too, so if x is std::vector<mynamespace::myclass> then mynamespace is also included in the lookup. Thus

namespace mynamespace {
    struct myclass {};
    void foo(std::vector<mynamespace::myclass> const&){}
}

int main() {
    std::vector<mynamespace::myclass> x;
    foo(x);
}

will call mynamespace::foo().

Finally, the lookup also extends to the namespaces of any templates used as template template parameters. e.g.

namespace mynamespace {
    template<typename T>
    struct mytemplate
    {};

    template<typename T>
    void bar(T const&) {}
}

template<template<typename> class T>
struct wrapper {};

int main() {
    wrapper<mynamespace::mytemplate> x;
    bar(x);
}

Even though wrapper is in the global namespace, mynamespace::bar will be found, because the template template parameter used for x is mynamespace::mytemplate.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文