问题标签 [token-name-resolution]

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 回答
126 浏览

c++ - 模板:名称解析->继承时此语句是否正确?

这是来自 ISO C++ 标准 14.6/6 的声明:

在类模板的定义中或在类模板成员的定义中,typename当引用声明类型的类模板的先前声明成员的非限定名称时,不需要关键字。当使用限定名称引用成员时,应始终指定关键字typename,即使限定符只是类模板名称。[示例:

关键字 typename 是必需的,无论限定名称是A还是A<T>因为A或是A<T>带有参数列表的类模板中的同义词<T>。]

这句话在继承时是真的吗?

如果是,任何人都可以解释一下吗?

我检查了内部类;它被接受了吗?但我无法检查继承?

0 投票
1 回答
4936 浏览

c++ - C++ 名称解析(和重载)规则列表

在哪里可以找到符合 C++ 的编译器必须应用的规则列表才能执行名称解析(包括重载)?

我想要自然语言算法或流程图之类的东西。

C++ 标准当然有这套规则,但它是随着新语言语句的引入而建立的,结果很难记住。

长话短说,我想知道“当编译器看到名称 'A' 时会做什么?”这个问题的完整而详细的答案。

我知道 C++ 就是“我们在 X 时这样做,但在 Z 成立时不这样做”所以,我在问是否有可能使它更线性。

编辑:我正在起草这个主题的草稿,一旦发布,可能会集体改进。但是,我这几天很忙,可能需要一些时间才能发布一些内容。如果有人感兴趣,我会将“原始 txt 文件上的个人笔记”推广到更好的内容并发布。

0 投票
3 回答
303 浏览

c++ - 类模板中名称解析的实际结果与c++ 03标准不同

我在 Xcode 4.1 和 Visual Studio 2008 上测试了 c++ 标准 ISO/IEC 14882-03 14.6.1/9 中的代码。两个编译器的输出都与标准的预期结果不同。

代码粘贴在下面。

作为标准的描述。预期的输出应该是

在 Xcode 4.1 上构建并运行代码。输出如下。在构建设置中,我尝试将“Compiler for C/C++/Object-C”更改为 Apple LLVM Compiler 2.1、Gcc 4.2 和 LLVM GCC 4.2。输出是相同的。

在 Microsoft Visual Studio 2008 上构建并运行代码。输出如下。

标准的描述(14.6.1/9)粘贴在下面。

如果名称不依赖于模板参数(如 14.6.2 中所定义),则该名称的声明(或声明集)应在该名称出现在模板定义中的点的范围内;该名称绑定到在该点找到的声明(或多个声明),并且此绑定不受在实例化点可见的声明的影响。[例子:

——结束示例]

代码对编译器来说格式正确,但输出不同。将此代码移植到不同的平台是非常危险的。

有人知道为什么这些编译器不遵循标准吗?

2011 年 10 月 11 日编辑

根据http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#197,标准中的示例是错误的。我在 Clang 和 Gcc 上测试了下面的代码。

输出符合预期。

谢谢,

杰弗里

0 投票
3 回答
1897 浏览

c++ - 全局命名空间中的保留名称

源于我对C++ 中的对象的动态数组的回答,以及关于在 C++ 标识符中使用下划线的规则是什么?:显然,_以大写字母开头的名称被保留在全局命名空间中。

17.4.3.2.1 全局名称 [ lib.global.names]

某些名称和函数签名集始终保留给实现:

  • 每个包含双下划线 ( __) 或以下划线后跟大写字母 (2.11) 的名称都保留给实现以供任何使用。
  • 每个以下划线开头的名称都保留给实现用作全局名称空间中的名称。165

165)此类名称也保留在命名空间::std(17.4.3.1) 中。

在我对第一个问题的回答中,我有一个看起来像这样的课程

在评论中,我被告知_Ints标识符调用未定义的行为,因为它是一个保留名称。然而,根据最近的标准草案,成员变量的名称查找使用以下规则进行:

3.4.3.1 类成员 [ class.qual]

如果qualified -id的nested-name- specifier 指定了一个类,则在该nested-namespeciifier之后指定的名称将在类的范围内查找 (10.2),但下面列出的情况除外。该名称应代表该类或其基类之一的一个或多个成员

对我来说,这意味着任何成员变量都不能成为全局命名空间的一部分,因为它的作用域是类。

现在,问题是:

我的理解是否正确,因为成员变量不在全局命名空间中,所以它们永远不会违反实现保留名称规则?如果我不正确,有人可以解释我对查找规则的误解吗?

0 投票
3 回答
281 浏览

c++ - 父类和内部类同名时名称解析错误

我对 Visual Studio 2003 有一个奇怪的情况。出于某种合理的原因,我有以下层次结构:

也就是说,我有一个与外部类的父类同名的内部类。当C尝试从 继承时B::A,Visual Studio 认为我指向的是父类A,而不是其中的嵌套类B。GCC 似乎像我预期的那样解决了内部类版本

这是 Visual Studio 2003 的错误,还是我做错了?是否有解决方法(除了升级 Visual Studio)?

0 投票
1 回答
60 浏览

c++ - 如何从模板派生类的模板基类调用成员?

使用此设置:

一切正常。但是,对于这个例子:

我得到:

有什么不同?为什么第二个会导致语法错误?

0 投票
1 回答
6255 浏览

c++ - 方法的声明改变了符号的含义

对于以下代码:

GCC 给出一个编译器错误:

但是 clang 接受它而没有编译器错误。谁是对的?

请注意,如果 typedef 被删除或更改为typedef ::foo foo_type,则 gcc 和 clang 都接受该代码。

0 投票
3 回答
235 浏览

c++ - 命名空间检测

我正在尝试编写一个使用外部工具的日志库

为了使库更自然地使用,我希望能够检测使用 cout 的名称空间。

具体来说,结果应该这样使用

结果输出应该是这样的

我已经使用std::streambuf向 cout 的输出添加某些关键字,我需要做的就是指定在哪个命名空间中使用哪个 streambuf。

我如何实现这一目标?

此外,我正在制作的库将被集成到具有多个名称空间的项目中,这些名称空间大量使用了using namespace声明。我需要一个不需要删除这些声明的解决方案。

编辑1:我不关心必须手动指定哪个名称空间与哪个字符串相关联或将对象添加到任何使用的名称空间(std当然除外)

0 投票
1 回答
533 浏览

c++ - 从属名称解析和命名空间标准/标准库

在回答这个 SO 问题时(最好阅读这个 "duplicate"),我想出了以下对运算符的依赖名称解析的解决方案:

[温度.dep.res]/1:

在解析从属名称时,会考虑来自以下来源的名称:

  • 在模板定义时可见的声明。
  • 来自实例化上下文 (14.6.4.1) 和定义上下文的与函数参数类型相关联的命名空间的声明。

但是 clang++ 3.2 和 g++ 4.8 没有找到这个操作符(名称解析)。

包含不<iterator>定义“模板的定义点”istream_iterator吗?

编辑:正如Andy Prowl所指出的,这与标准库无关,而是与名称查找有关(可以通过operator>>在 fake 的命名空间中模拟标准库中的多个,至少一个来证明istream)。


Edit2:一种解决方法,使用 [basic.lookup.argdep]/2 bullet 2

当然,您也可以使用自己的pair类型,只要变通方法在 custom 的命名空间中引入关联类即可operator>>

0 投票
1 回答
564 浏览

c++ - c++ 命名空间解析(基于参数的“自动使用”?)

当我从这个命名空间之外调用一个在命名空间中声明的函数时,我通常需要显式地在命名空间前加上前缀:

但是我有这种情况,编译器似乎可以自动设计我想使用的函数:

Q1:是不是因为编译器可以根据参数类型自动选择合适的函数?或者是其他东西?


经过更多测试,我发现如果我在另一个命名空间中添加另一个具有相同声明的函数,我的编译器不会报错:

Q2:如何取消激活此行为?

编辑: 我的编译器:gcc version 4.7.2 (Debian 4.7.2-5)