【问题标题】:Unqualified lookup in C++C ++中的不合格查找
【发布时间】:2017-08-16 12:33:20
【问题描述】:
#include <stdio.h>
#include <cstddef>
#include <cstring>

namespace /*namespace name generated by compiler*/
{
    struct BB{};
}

struct AA{};

namespace my
{
    inline void * memcpy(void*, const void*, std::size_t)
    {
        puts("CUSTOM IMPLEMENTATION");
        return 0;
    }
}

namespace my
{
    void func()
    {
        AA a;
        memcpy(&a, &a, sizeof(a)); // ambigious call for g++4.7 - g++6.2

        BB b;
        memcpy(&b, &b, sizeof(b)); // unambigious call

    }
}

int main(int, char **)
{
    my::func();
    return 0;
}

为什么 memcpy 在这里是模棱两可的称呼?

请查看 ANSI ISO IEC 14882、C++2003、3.4.1、(6)(第 30 页)中变量“i”的示例。它“证明”了这种结构没有歧义。

namespace A {
  namespace N {
    void f();
  }
}
void A::N::f() {
    i = 5;
// The following scopes are searched for a declaration of i:
// 1) outermost block scope of A::N::f, before the use of i
// 2) scope of namespace N
// 3) scope of namespace A
// 4) global scope, before the definition of A::N::f
}

不合格的查找规则是否在 GCC 中被破坏或者我没有理解某些内容?

【问题讨论】:

  • 您能否将 C++2003, p.30 中的示例包括在内。 3.4.1, (6) ?
  • 最好把例子贴在这里。
  • 如果您希望我们参考语言标准的某些特定部分,如果您引用该标准的相关部分会更有帮助。跨度>
  • 我看不出你的代码和例子有什么相似之处。
  • @tobi303 附加示例

标签: c++ g++ language-lawyer name-lookup


【解决方案1】:

要查找的名字是函数名;特殊的argument-dependent lookup 规则在这里生效。 (请注意,ADL 是函数名称 unqualified name lookup 的一部分。)

除了通常的非限定名称查找所考虑的范围和名称空间之外,还会在其参数的名称空间中查找这些函数名称。

首先你包含string.h,它在全局命名空间中引入了名称memcpy

并且AA在全局命名空间中声明;那么当你调用memcpy(&amp;a, &amp;a, sizeof(a));时,也会考虑声明AA的命名空间(即全局命名空间),而命名空间my中声明的memcpy会被通常的unqualified name lookup找到,所以调用是模棱两可的。

另一方面,BB 没有这样的问题,因为它没有在全局命名空间中声明(然后 ADL 不会对其生效)。

【讨论】:

  • 谢谢。看起来你是完全正确的。当我阅读 B.Stroustroup, The C++ Programming Language: Special Edition (3rd Edition) (Russian translate), p.221, 8.2.6 Search names - 有人说“如果在上下文中找不到函数使用它时,会尝试搜索参数的命名空间”。看起来标准化委员会改变了一些规则。
  • @bruziuz 可能是描述问题,我在看翻译书时经常遇到这样的问题;确切地说应该是“所有由 ADL 和通常的非限定名称查找找到的名称都将添加到名称集中,然后重载解析将确定应该调用哪个名称”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 2016-03-27
  • 2014-07-22
相关资源
最近更新 更多