问题标签 [dependent-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 投票
0 回答
185 浏览

c++ - C++中“依赖名”的定义是什么?

在 C++ 中,依赖名称的概念很重要,因为:

这样的名称是未绑定的,并且在模板实例化的点上查找......在模板定义的上下文和实例化点的上下文中

但是,该标准唯一说的是在[temp.dep]/2中给出了一个依赖名称,指的是不合格的函数调用,基本上是为了使 ADL 对这些函数调用完全有效。

除了这些之外,还有其他从属名称吗?

考虑一些这样的代码,例如:

如果将其称为“从属名称” ,根据标准,bar这在技术上是否是对该术语的不正确使用?

0 投票
2 回答
278 浏览

c++ - “typename iterator_traits”是什么意思::difference_type”是什么意思?

这是来自https://devdocs.io/cpp/algorithm/count_if的计数算法的示例实现:

我的问题是, 的意义是typename iterator_traits<InputIt>::difference_type什么?
如果我正在实施这个,我会简单地用来unsigned int跟踪计数。

0 投票
1 回答
55 浏览

c++ - 使用别名作为范围获取父成员时的不同编译器行为

此代码在 Clang 和 Visual C++ 上编译得很好,但在 GCC 上编译得不好:

来自 GCC 的错误消息是

哪一个是对的?

0 投票
1 回答
57 浏览

c++ - 为什么这不是一个独立的名字?

在类中,需要将D0变量编写为使其成为将在基类中查找的依赖名称。mthis->m

但是在类D1中,编译器知道在基类中查找m而不m被写为this->m.

这怎么可能?为什么m在课堂D1上不需要写成this->m

0 投票
2 回答
92 浏览

c++ - 结构声明被变量隐藏时的名称解析

让我们考虑以下演示程序。

正如所见,struct B结构中成员的声明被类型A为 的数据成员的声明所隐藏。Bint

所以在模板结构声明的函数定义中

T::B不应该找到依赖的名称。

但是编译器gcc 8.3成功编译程序并且程序输出

另一方面,编译器Visual C++ 2019不会编译程序并发出语法错误。

那么它是编译器gcc 8.3的错误吗?

第二个问题是,如果允许这种带有详细类型说明符的构造(带有未注释的关键字结构)是很自然的。

但是,两个编译器都认为该构造不正确。

确实不正确吗?

0 投票
0 回答
37 浏览

c++ - C++ 入门第 5 版模板依赖和非依赖名称

在 C++ Primer 第 5 版第 16 章模板中:

“由模板的提供者确保在使用模板时所有不依赖于模板参数的名称都是可见的。此外,模板提供者必须确保模板的定义,包括模板的定义类模板的成员,在模板实例化时可见。”

但我认为这是一个错误:模板参数上的AFAIK非依赖名称必须在定义模板时可见,而不是在“使用”时可见。

我对么?

这是我的例子:

因此,尽管我没有实例化foo但没有抱怨声明do_it只要是从属名称,但代码应该无法编译。

那么这是书上的错字吗?

0 投票
1 回答
70 浏览

c++ - 在从未实例化的模板中不正确使用非依赖名称是否需要诊断?

以下是标准对模板定义中非依赖名称的说明

模板定义中使用的非依赖名称是使用通常的名称查找找到的,并在使用它们时绑定。

[示例 1:

——结束示例]


我对“格式错误:......这可以在此处或在实例化点进行诊断h++;”的评论感到困惑。如果实现选择后者,但没有模板的实例化怎么办?这要在哪里诊断?

这是否意味着这实际上是不正确的,而不需要诊断

0 投票
2 回答
62 浏览

c++ - 为什么在模板中我们可以使用依赖名称而无需在没有实例化的情况下已经声明?

我编写了这段代码来理解template名称查找:

bar(int)故意注释掉了函数的声明。此函数bar(int)用作dependent name模板函数中的一个foo。所以它受实例化的约束。

  • 我已经在专业化bar之后foo和之前进行了定义,foo<int>以便后者可以看到bar(int).

但是当我编译代码时,我得到了这个错误:

‘bar’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]|. 如果我取消注释bar(int)它的声明工作正常?!

  • 如果我必须在模板中将其用作从属名称之前声明一个名称,那么为什么 C++ 允许在未实例化的情况下使用它。(如果我不“使用”模板化函数,代码是否有效foo)?

那么允许调用尚未声明并且在实例化时会失败print(u)的想法是什么?do_it

0 投票
1 回答
39 浏览

c++ - 查找从属限定名

该程序不编译 ( error: 'foo' is not a member of 'N'):

但是如果我们取消注释 的声明void foo();,它就会编译。演示

两个版本都有错误。foo即使声明,也不接受任何参数。以下问题自提出。

  • 为什么一个版本可以编译,而另一个版本不行?
  • C++ 标准中是否有这样的规则?“如果编译器能够证明没有任何实例是格式正确的,它可以(但不是必须)在没有实例的情况下诊断错误。”

我的理论如下(正确吗?)。里面template_func N::foo同时是一个限定名和一个从属名。依赖名称的查找被推迟到模板的实例化。查找名称(如果成功)会导致将该名称的使用与该名称的声明联系起来。但是这个过程包括两个步骤(我们现在只考虑限定名称,看起来像一个函数调用):

  1. 在限定符的范围内查找名称(在此示例中,这意味着 namespace N)。这可能会找到多个名称,因为函数可以重载。
  2. 检查参数是否可以传递给找到的名称。这包括找到一个最佳匹配,如果有多个fooN. 这种方式的使用与N::foo声明相关联N::foo

实际上第一步可以在没有实例化的情况下完成。编译器似乎会这样做,如果没有foo找到,它会诊断错误(这是可选的)。如果至少foo找到一个,它不会打扰进一步的分析。

0 投票
1 回答
76 浏览

c++ - 模板类型是否有等效的“typename”?

我们有一个表单的模板成员函数:

现在,在从依赖名称显式指定 TT 的调用上下文中:

Visual Studio 能够编译调用。海合会抱怨:

并劝说typename SomeConcreteType::template_type。这不起作用,因为SomeConcreteType::template_type是模板类型,而不是普通类型。

  • 有没有可以在这里使用的关键字?
  • 让三大编译器接受它的另一种方法是什么?

编辑:现在使用 Godbolt 最小示例 https://godbolt.org/z/hvbb6jv9W