问题标签 [name-lookup]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
209 浏览

c++ - 合格基类的名称查找

考虑这段代码:

g++ 的输出是:

我的问题是:

  • (1) 是如何工作的 - 我会认为基类的名称是D::S专门的
  • (1) 和 (2) 都需要工作吗?
  • 为什么S s;insidef()D::S而不是::S
0 投票
0 回答
176 浏览

c++ - C++ non-qualified lookup

I have the following code:

The idea is to imitate the behavior of gtest operator<< & PrintTo, so that one could overload behaviour for some std classes, which can not be done through ADL since adding anything to std namespace is not allowed. However, if I try to do it with a usual function f(), then the overload for f(mystd::A()) is considered to be defined too late (if one comments the template definition of f() the gcc gives note: ‘int f(const mystd::A<int>&)’ declared here, later in the translation unit)

The question is why the behaviour is different for operator-() and f()?

0 投票
1 回答
410 浏览

c++ - 执行限定名称查找时 Clang 和 GCC 之间的不同行为

考虑以下程序:

用 clang 编译它会产生以下编译器错误:

GCC 没有给出任何编译器错误。我试图弄清楚我应该为哪个编译器提交错误报告。哪个编译器具有正确的行为以及原因(对 c++ 标准的引用)?

魔杖盒-Clang:http ://melpon.org/wandbox/permlink/s0hKOxCFPgq5aSmJ

魔杖盒 - GCC:http ://melpon.org/wandbox/permlink/i2kOl3qTBVUcJVbZ

0 投票
1 回答
103 浏览

c++ - 名称查找歧义不一致

我试图理解为什么这个程序没有为 i 提供名称查找歧义:

如果我们像这样修改它,我们会得到名称查找歧义:

我在这里所做的唯一更改是删除命名空间 Q 并将其内容放在全局命名空间中。

我尝试了 3 种不同的编译器:

所有人都给出了这封电子邮件中所述的结果,我正试图找出原因。

任何人都可以用 c++ 标准来解释这种行为吗?我无法理解它。

0 投票
1 回答
51 浏览

c++ - 如何解释 c++ 标准中的规则 [namespace.udir]p2?

我对 [namespace.udir]p2 的含义有点困惑。考虑以下程序:

在它的i主要名称查找失败(我尝试使用 GCC、Clang 和 Visual c++)。这似乎与 [namespace.udir]p2 ( http://eel.is/c++draft/dcl.dcl#namespace.udir-2 ) 不一致:

using-directive 指定指定命名空间中的名称可以在 using-directive 出现在 using-directive 之后的范围内使用。在非限定名称查找 ([basic.lookup.unqual]) 期间,名称看起来好像它们是在最近的封闭命名空间中声明的,其中包含使用指令和指定命名空间。[注:在此上下文中,“包含”是指“直接或间接包含”。——尾注]

在我的程序中,我将这个规则应用于由ini声明的 name ,方式如下:int i = 1;X

  • 使用指令:using namespace X;

  • 指定的命名空间:X

  • 最近的封闭命名空间:全局命名空间

这是否意味着iin的非限定名称查找main应该找到X::i?为什么我尝试的三个编译器都没有得到这个结果?

0 投票
2 回答
193 浏览

c++ - 通过 using-directive 在 using-declaration 中查找名称

根据 c++ 标准,以下程序是格式正确的还是格式错误的?

我使用不同的编译器得到不同的结果:

根据 c++ 标准,这个程序是格式正确的还是格式错误的?需要对 c++ 标准的引用。

我试图弄清楚我应该为哪个编译器提交错误。

0 投票
3 回答
758 浏览

c++ - 名称查找和类范围

为什么setVal的返回类型是string类型,参数类型是double类型

0 投票
2 回答
108 浏览

c++ - 非限定名称查找涉及 using-directives 时 [basic.scope.hiding]p2 的解释

在 C++ 中有两种类型的名称隐藏:

1)普通名称隐藏:[basic.scope.hiding]p1(http://eel.is/c++draft/basic.scope.hiding#1):

可以通过在嵌套声明区域或派生类 ([class.member.lookup]) 中显式声明相同名称来隐藏名称。

2) [basic.scope.hiding]p2 ( http://eel.is/c++draft/basic.scope.hiding#2 ) 中隐藏的特殊名称类型:

类名 ([class.name]) 或枚举名 ([dcl.enum]) 可以被同一作用域中声明的变量、数据成员、函数或枚举器的名称隐藏。如果一个类或枚举名称和一个变量、数据成员、函数或枚举器在同一范围内(以任何顺序)以相同名称声明,则无论变量、数据成员、函数或枚举器名称可见。

我很想知道在执行非限定名称查找时名称隐藏如何与 using-directives 交互。

对于第一种类型的名称隐藏行为是非常清楚的。这是因为 [basic.scope.hiding]p1 已根据 [basic.lookup.unqual] ( http://eel.is/c++draft/basic.lookup.unqual )部分中的规则重新制定

第二种类型的名称隐藏没有这样做。所以现在出现了以下问题:

*) 这第二种类型的名称隐藏应该如何与涉及使用指令的非限定名称查找交互?

在标准的其他地方我发现 [namespace.udir]p2 ( http://eel.is/c++draft/namespace.udir#2 ) 我认为这是回答这个问题的关键:

using-directive 指定指定命名空间中的名称可以在 using-directive 出现在 using-directive 之后的范围内使用。在非限定名称查找 ([basic.lookup.unqual]) 期间,名称看起来好像它们是在 最近的封闭命名空间中声明的,其中包含使用指令和指定命名空间。[注:在此上下文中,“包含”是指“直接或间接包含”。——尾注]

将此规则的 asif 部分应用于[ basic.scope.hiding ]p1 与 [basic.lookup.unqual] 部分中的规则保持一致。此应用程序也与 [basic.scope.hiding]p4 ( http://eel.is/c++draft/basic.scope.hiding#4 ) 一致,因此看起来很有希望。

因此,我认为我们可以通过类似地将 [namespace.udir]p2 的as if部分应用于 [basic.scope.hiding]p2 来回答问题 *)。此应用程序也与 [basic.scope.hiding] p4 一致。我认为这也是对 c++ 标准最自然、最简单的解释。

然而问题是 Clang 和 GCC 并没有做出与我相同的解释。例如:

根据我的解释,这个程序应该是格式正确的,i应该作为整数变量来查找。Clang 和 GCC 都不同意这一点,因为它给出了名称查找歧义。

在 Clang 的情况下,这种更复杂的解释会导致以下错误:

没有错误,但改变

进入

我们得到名称查找歧义错误。GCC 至少在这里是一致的。

我是否正确解释了 C++ 标准?

0 投票
2 回答
687 浏览

c++ - 使用 using-declarations 时,非限定名称查找如何工作?

根据 c++ 标准,这是格式错误还是格式正确?

Clang 拒绝它,而 GCC 接受它。

根据 [namespace.udir-6] ( http://eel.is/c++draft/basic.namespace#namespace.udir-6 ):

如果名称查找在两个不同的命名空间中找到一个名称的声明,并且这些声明没有声明相同的实体并且没有声明函数,则该名称的使用是错误的。

我们应该如何解释这一点?请记住,每个 using-declaration 都通过 [namespace.udecl]p1 ( http://eel.is/c++draft/namespace.udecl#1 ) 声明一个名称:

using-declaration 将名称引入到 using-declaration 出现的声明性区域中。

using-declaration :
   using typenameopt 嵌套名称说明符 unqualified-id ;

在 using-declaration 中指定的成员名称在 using-declaration 出现的声明区域中声明。[注:只有指定的名称是这样声明的;在 using-declaration 中指定枚举名称不会在 using-declaration 的声明区域中声明其枚举数。— 结束注释] 如果 using 声明命名了一个构造函数([class.qual]),它会在出现 using 声明的类([class.inhctor])中隐式声明一组构造函数;否则,在 using-declaration 中指定的名称是另一个命名空间或类中的一组声明的同义词。

所以我们有 4 个名称 i 的声明。

不合格的名称查找i在其中sizeof(i)找到哪些?

它是否只找到using M::i;using N::i;哪些都在同一个命名空间(全局命名空间)中,所以程序格式正确?

或者它是否只找到struct i {};并且static int i = 1;哪些位于不同的名称空间中,因此程序格式错误?

还是我们有其他选择?

0 投票
1 回答
242 浏览

global-variables - D 中 :: 运算符的等价物是什么?

我刚刚开始学习 D。在 C++ 中,如果全局变量和局部变量具有相同的名称,则有 ::(作用域解析运算符)可以从函数中访问全局变量。但是如何在 D 语言中做到这一点呢?考虑这个程序。

如何从 main() 函数中打印全局变量 a 的值?D 是否提供这种运算符?