问题标签 [name-hiding]

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 投票
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 投票
2 回答
612 浏览

java - Java 嵌套范围和变量的名称隐藏

我正在学习 Java 中的名称查找,并且来自 C++,我发现有趣的是,即使 Java 允许我嵌套许多代码块,我也只能在第一个嵌套范围内隐藏名称:

从 C++ 的角度来看,这很奇怪,因为在那里我可以嵌套多少个我想要的范围,并且我可以随意隐藏变量。这是Java的正常行为还是我错过了什么?

0 投票
3 回答
7151 浏览

c++ - C++ 继承和名称隐藏

我知道这不是关于这个主题的第一个问题,但据我说,我读到的所有其他相关问题(和答案)都有些不合时宜。拿代码

使用最新版本的 g++ 编译此代码会出现错误

正是因为这个错误,我才找到 Stackoverflow 来寻找答案。但没有一个答案让我信服。这两种方法的签名在区分它们时没有歧义,编译器应该能够在基类中选择方法。只需注释掉

并且代码按预期工作。这意味着在基类中隐藏同名成员函数只是成员函数名称,并且不考虑签名,就像函数名称没有被修改一样(在这种情况下,修改应该解决任何歧义)。其他人在类似的问题中写道,这违背了 C++ 的精神(以及我补充说的面向对象),我完全同意他的观点。这是函数重载的一个限制,我真的没有看到任何合理的理由。

显然问题已经关闭,所以我无法在阅读答案后添加回复,除了编辑我自己的初始问题。我相当肯定(但我无法证明这一点)在较旧的 C++ 编译器中,我最初问题中的代码可以毫无问题地编译(然后执行)。我的观点是,我真的看不出这种语言设计(正如回复中所说的那样)选择背后的基本原理。在这种情况下,编译器可以使用所有信息以采取适当的措施,这正是我所期望的。否则看起来,通过语言设计选择,它被选择不考虑成员函数的签名,这听起来很奇怪。我在上面提到的“programmerinterview”阅读了这篇文章,

0 投票
0 回答
48 浏览

c++ - C++ - 为什么派生类方法 void m(const T) 会覆盖基类方法 void m(T)?

情况1:

案例二:

案例 1:a->m(t)(主要)调用 B::m(T)(覆盖)
案例 2:a->m(t)(主要)调用 A::m(T)(重载)

为什么T& vs const T&是类型不匹配但T vs const T不是?

0 投票
2 回答
3334 浏览

c++ - 变量名与函数名相同会导致编译器错误...为什么?

今天遇到一个有趣的问题,并试图了解原因。

考虑以下:

我收到以下错误:

明显调用括号前的表达式必须具有(指向)函数类型

我想我明白为什么我会收到这个错误:

  1. 当在function1外部被自己调用时function2(),它实际上是一个指向的函数指针function1()

  2. 在声明的范围内function2int function1function1变量”隐藏function1了“函数指针”。

  3. function1()内部调用时function2(),它假设function1是变量并给出错误。

  4. 这是通过调用Base::function1();inside来解决的function2()

我的问题是:为什么编译器在声明时不给出错误int function1;?这不应该被允许吗?

0 投票
2 回答
100 浏览

c++ - 为什么 c++ 编译器(VS2013)选择了错误的函数?

  1. 第一个案例

    /li>

完美运行。
程序输出
Write(int) 被调用

2.第二种情况。
只需将第一个函数移动到基类:

程序输出
Derived::Write(wchar_t) 被调用
但我预计“Base::Write(int) 被调用”
第二种情况有什么问题?

0 投票
2 回答
53 浏览

c++ - 返回类型和参数列表都更改时隐藏名称

我的基本问题是为什么名称隐藏在返回类型和参数列表都更改时不适用。请参考下面的样片。

输出 :

在上述程序中

a) 为什么 Derived2 对象不隐藏字符串版本?

b) 为什么当返回类型和参数都匹配时名称隐藏不适用?

有关“名称隐藏在编译器级别如何工作”的任何链接或参考?很有用。

谢谢你。

0 投票
1 回答
92 浏览

ruby - 替换代码片段中的类和变量名称

我想在 CV 中插入我的代码的一些要点。为了不知道这段代码是关于什么的,我想用一些随机字符串自动替换所有类、方法和变量名称(使用一些脚本或在线创建者?),这样我就可以显示“我是如何编写的”,但我没有'不显示真正的功能。

我想改成:

或者也许有人知道更好的方式来向其他人展示“我的代码看起来如何,但没有向他展示功能”?

提前致谢

0 投票
1 回答
702 浏览

c++ - 为什么 C++ 不支持跨范围重载?

我相信这里已经给出了最好的答案:为什么派生类中的重写函数会隐藏基类的其他重载?

但我有点困惑,特别是声明:

为了覆盖此行为,需要用户进行显式操作:最初是重新声明继承的方法(当前已弃用),现在显式使用 using-declaration。

假设我有以下程序:

我有两个问题:

  1. 我可以假设,wrt 派生类对象,该int f(int i)函数根本不存在。由于名称隐藏,这不是继承的。

  2. 如果我必须在派生类中使用这个函数,我必须在派生类中重新定义它吗?

0 投票
1 回答
423 浏览

c++ - 通过 Derived::f2() 调用 f1() 时调用了谁的函数?

你好,

这个问题是一个考试用词,但我很难找到正确的方式来描述它并在网上寻找它。

排队 :

输出是:

在派生的 f2() 中有对 f1() 的调用。谁会被召唤?Base 类型的 f1() 还是 Leaf 类型的 f1()?根据我所学到的,编译器总是在左边的类型中寻找函数。(Base* p2 = new Leaf(*p) ) 但是在这里我可以看到它转到了 Leaf 类的 f1() 。我可以看到它是Leaf的,但不明白为什么......

感谢帮手!