问题标签 [injected-class-name]

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 投票
4 回答
252 浏览

c++ - 在 C++ 中交换类和结构关键字

我在这里阅读了一个名为Injected 类名的奇怪 C++ 功能 的奇怪 C++ 功能。

我尝试遵循简单的程序

如果我在 main() 程序的第一行用struct替换class关键字,仍然可以编译并运行良好。在此处查看现场演示。为什么?我不应该得到编译器错误吗?为什么它编译得很好?

0 投票
1 回答
159 浏览

c++ - 继承构造函数后查找基类名称

考虑以下代码:

直观地说,很明显这段代码是有效的,并且可以编译(用 gcc 和 clang 测试)。

但是,我想了解标准中的哪些内容使其有效。具体来说,我想了解名称查找basein如何base foo()找到基类类型而不是继承的构造函数。

这是我对标准措辞的分析,表明它应该解析为构造函数。这可能是错误的,但我想了解我哪里出错了。

我从[class.member.lookup] p1

成员名称查找确定类范围内名称 ( id-expression ) 的含义。[...] 对于id-expression,名称查找从类范围开始this

p7告诉我们名称查找的结果是什么:

[a member name]f在 [a class scope]中的名称查找结果是S(f, C)C的声明集

我正在尝试使用Cbeingderivedf正在使用basein来遵循此过程base foo()

“声明集”定义在p3

in的查找集,称为S(f, C),由两个组件集组成:声明集,一组名为 的成员;[...]fCf

p4告诉我们声明集中的内容:

如果C包含 namef的声明,则声明集包含 declare in 的每个声明fC满足查找发生的语言构造的要求。

using base::base是 ( ) 中名称( base)f的声明。该段继续举例说明声明不满足发生查找的语言构造的要求意味着什么但没有任何内容可以排除在此查找之外。derivedCusing base::base

接下来,p3我们被告知如何处理声明集中的using-declarations :

在声明集中,使用声明被派生类的成员不隐藏或覆盖的指定成员集替换

那么using base::base指定哪些成员呢?在我看来,这是由以下人员回答的[class.qual] p2

在不忽略函数名称并且 嵌套名称说明符指定一个类的查找中C

  • 如果在nested-name-specifier之后指定的名称,当在 中查找时C,是 的注入类名C,或者

  • 在作为成员声明的using-declaration中,如果在嵌套名称说明符之后指定的名称与嵌套名称说明符的最后一个组件中的标识符[...]相同

该名称被认为是命名 class 的构造函数C

有一个脚注阐明了“不忽略函数名称的查找”的含义:

忽略函数名称的查找包括出现在嵌套名称说明符详细类型说明符基本说明符中的名称。

这些都不是所讨论的名称查找的情况,所以在我看来,这一段适用,并说using base::base指定了构造函数(这也是你直观地期望的,因为它是继承构造函数声明)。

在派生类范围内找到声明(指定基类构造函数)后,我们继续以下操作[class.member.lookup] p4

如果结果声明集不为空,则子对象集包含C自身,计算完成。

也就是说,由于名称查找在派生类范围内找到了结果,因此它不会继续在基类范围内查找(它会在其中找到注入的类名称 base)。[顺便说一句,即使名称查找继续进入基类范围,我也看不到任何可以在构造函数和注入的类名称之间消除歧义的东西]。

我的推理哪里出错了?

0 投票
2 回答
126 浏览

c++ - 在构造函数中为类名添加和省略模板参数之间的区别

我想知道两者之间是否存在本质区别:

两者似乎都有效,但我不明白两者之间的区别。第一个让我很困惑,我不明白<T>在这里的作用是什么。

0 投票
0 回答
29 浏览

javascript - 一个简单 js 的小奇怪问题

我在一个简单的脚本上遇到了一个小问题它只对两个应用了一个类名。这是我的代码。在此先感谢所有社区,请原谅一个法国人的英语不好:-)!


0 投票
1 回答
158 浏览

c++ - 为什么注入的类名有时不被视为类模板中的模板名?

资源

在以下情况下,注入的类名被视为类模板本身的模板名:

  • 它后面是 <
  • 它用作对应于模板模板参数的模板参数
  • 它是友元类模板声明的详细类说明符中的最终标识符。

因此,我尝试检查所有 3 个案例(此外,在基本歧义的背景下,尽管我认为这在这里无关紧要)。

第一种情况看起来很简单。

问题是 - 为什么不注释掉的例子有效?他们不在 GCC 和 Clang 上,所以我认为这不是实施问题

上面的规则是否仅适用于模板本身,而不适用于基础?如果是这样,基地的规则是什么,尤其是最后两个案例?

0 投票
1 回答
190 浏览

c++ - 带有可变参数构造函数的好奇 Mixin

我有一个代码被剪断,包括某种可变参数 mixin crtp 和一些相关问题。我是否正确理解在下面的代码中,第二个构造函数只是将那些用于实例化 X 的类的实例的副本传递给那些非常相同的类的构造函数?

这种行为的用例是什么?这个示例和下面的代码片段有什么区别?

两者都可以编译,但我认为,必须明确指定 X 本身就是一个可变参数类模板,但这似乎没有必要......

非常感谢您的帮助

0 投票
1 回答
243 浏览

c++ - 为什么声明私有基类会使类型名称无法访问?

令我惊讶的是,在以下示例中,将 Middle 的基类声明为 private 使得该名称在后续派生中作为类型不可用。

因此使用 g++ (Debian 6.3.0-18+deb9u1) 6.3.0 20170516 编译...

我得到以下诊断:

显然,在 Base 被用作 Middle 的基类时,它的名称可以作为一种类型使用。我可以理解,当 Base 用于表示应该是私有的基类存储时。但是,至少声明一个私有基类会使类型名称无法访问,这似乎是出乎意料的。

0 投票
2 回答
143 浏览

c++ - C++ 中的私有继承可见性/访问

为什么接口由于私有继承而在方法中具有特殊的可见性?

请注意,我的派生类中需要全局说明符:: 。

我不明白为什么一个方法由于私有继承而继承了某种可见性。Derived 类无法访问 Control 是完全合理的。但为什么它也不能通过成员访问?

注意:我知道我们可以通过组合来解决这个问题。但我想知道为什么它在 C++ 中是这样定义的。我们可以打破 const-ness 还是什么?

0 投票
1 回答
90 浏览

c++ - 如果函数是在类的主体内定义的,是否需要在成员函数的返回类型中指定 typename?

考虑下面的例子:

上面两个函数的返回值有区别吗?如果不是,应该首选哪一个?

0 投票
2 回答
129 浏览

c++ - 当 Injected-Class-Name 发生时会发生什么?(C++)

根据https://en.cppreference.com/w/cpp/language/injected-class-name

在类作用域中,当前类的名称被视为公共成员名称;这称为注入类名。名称的声明点紧跟在类定义的左大括号之后。

那么代码中到底发生了什么?X* p变成X::X* p了?