繁体   English   中英

调用ADL时,表达式和名称空间之间是否会发生冲突?

[英]Are collisions between expressions and namespaces expected when invoking ADL?

给定以下示例,我希望解析器将std识别为一个函数:

#include <algorithm>

namespace test
{
    class foo{};

    void std(foo f);
}

int main()
{
    std(test::foo());
    return 0;
}

但是,对于GCC 4.8.4,这将导致错误- “错误:意外的名称空间名称'std':预期的表达式。”

使用clang 5.0时,出现“错误:意外的名称空间名称'std':预期表达式”

这是预期的吗? 我无法想象解析器在这里没有足够的上下文来区分表达式和名称空间?

编辑:示例使用应调用ADL的更复杂的类型。 在我的实际用例中,代码是通用的,我需要ADL。

int没有ADL。

如果普通的不合格查找发现“既不是函数也不是函数模板的声明 (例如名称空间的声明)等信息,则也没有ADL。

您的示例由于几个原因而无法正常工作。

  1. 它不使用ADL。 如果函数的参数是名称空间中定义的类型,则将使用ADL。 例如

     namespace test { struct bar {}; void foo(bar b) {} } // uses ADL to resolve to test::foo. foo(test::bar()); 
  2. std是一个名称空间。 在没有其他作用域限定符的情况下使用时,它是名称空间的名称。 因此,即使您使用了在命名空间中定义的类型,也不会使用ADL。 因此,以下情况也不正确。

     namespace test { struct bar {}; void std(bar b) {} } std(test::bar()); 

请注意,您可以使用:

namespace test
{
   struct bar {};

   void std(bar b) {}
}

test::std(test::bar());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM