问题标签 [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.
c++ - 函数体中声明的名称的非限定名称查找
我遇到过声明定义:
声明是一个定义,除非它声明一个函数而不指定函数的主体
在3.3中说
除非潜在范围包含另一个同名声明,否则声明的范围与其潜在范围相同。
问题 1.这是否意味着在我的情况下,当我们将 foo 重新声明为 main 函数时,重新声明的 foo 实际上表示的实体与声明为全局范围的 foo 表示的实体不同?
问题 2.为什么不合格的名称查找解析会给出一个由“全局”foo 表示的实体?
UPD:如果我们考虑以下
然后a
在函数范围内没有表示 global a
。怎么解释?
c++ - 两阶段名称查找:POD 与自定义类型
编译运行代码时
我得到输出(使用 g++ 4.8、clang++ 3.2 或 icpc 13.1)
虽然考虑到两阶段查找规则,最后两行对我来说非常有意义,但我希望foo(int) foo(double)
前两行。
似乎在这种情况下,foobar()
调用foo()
在实例化之前被查找,这是不可能的。有什么提示吗?
c++ - 访问从模板类派生的类中的基成员函数
我正在开发一个库,我设计了一个复杂的继承,其中包括模板类并从它们派生。我的问题是一个基模板类具有虚拟重载运算符,它接受 2 个参数并返回一些值。在基类中实现了这个操作符,大多数派生类没有重新实现这个操作符。
其他一些类将派生类用于某些工作并利用它们的操作员成员函数。只要派生类没有其他重载运算符,即使参数数量不同,一切都可以正常工作。如果这样做,则无法使用它访问基类运算符,object()
因为编译器找不到正确的成员函数(抱怨参数计数不匹配)。
是否指定了基类的默认模板参数并不重要。派生类的定义顺序也不会改变导致问题的运算符(它始终是SpecificDerived
类)。
下面我提出简化的问题。
[编辑] 示例已简化
基类定义:
派生类定义的用户:
派生类:
主功能:
编译器退出并声明存在no matching function for call to 'SpecificDerived2::memberFunc(float)'
来自gobble
函数的错误。仅当派生类或基类具有两个同名但参数不同的重载函数时,才会出现问题。
我正在使用支持 c++11 的 MinGW32 4.8.1。
c++ - 我不明白标准中的 3.4/2
我不明白标准中的 3.4/2:
“在表达式的上下文中查找”的名称在找到表达式的范围内被查找为非限定名称。
如果名称符合条件怎么办,N::i
如下所示?
限定名N::i
不在找到的范围内N::i
查找,即不在 main() 的范围和全局范围内查找!
c++ - 为什么只有当类不是模板时超类类型定义才在范围内?
考虑以下从我正在编写的一些迭代器中简化的代码:
在NoTemplate
中,我可以很容易地访问std::iterator<std::forward_iterator_tag, array<int, 5> >::value_type
as value_type
。但是,WithTemplate
我需要把所有东西都写出来。为什么?
如果我用注释的声明替换v
in的声明WithTemplate
,g++ 4.8.1 会给出错误:
c++ - 朋友声明:这是clang中的错误吗?
§3.4.1/3 有以下示例:
编译时没有错误(参见live example ),因为编译器在声明中的名称的N::A::f(A&)
普通查找中看不到友元声明,根据 §7.3.1.2/3 这是正确的。f
int i = f(a);
§7.3.1.2/3(重点是我的):
在命名空间中首先声明的每个名称都是该命名空间的成员。如果非本地类中的友元声明首先声明了一个类或函数,则友元类或函数是最内层封闭命名空间的成员。在该命名空间范围内(在授予友谊的类定义之前或之后)提供匹配声明之前,未限定查找 (3.4.1) 或限定查找 (3.4.3) 无法找到朋友的名称。
现在,如果我们包含声明
在上面的代码片段中namespace N
,在 之前,struct A
代码将正确地发出错误(参见实时示例),因为现在该函数是通过在表达式::f(A&)
中的名称的普通查找找到的,这符合 §7.3.1.2/3。f
int i = f(a);
但是,如果我们包含声明
在namespace N
之后,代码出人意料地struct A
没有发出任何错误,请参见live example。
c++ - 函数、类和变量都同名
为什么其中一些编译而一些不编译?
场景一:编译错误'main' : redefinition; previous definition was 'data variable'
场景二:编译错误syntax error : missing ';' before identifier 'obj
场景3:工作正常
场景4:工作正常
c++ - 在查找命名空间名称期间可以考虑哪些其他名称,而不是命名空间名称?
§3.4.6/1:
在using-directive或namespace-alias-definition中,在查找命名空间名称或 嵌套名称说明符中的名称期间,仅考虑命名空间名称。
基本上,我要问的是:“为什么这一段是必要的?”
go - 在不知道您是否在该包中的情况下引用 Go 包中的符号?
假设F
包A
中有一个函数,我正在创建的一些代码需要调用。我怎么称呼它?
如果我从外部包调用它A
,那么我使用A.F(...)
,如果我在里面,A
我使用F(...)
. 但是,如果墨菲阻止我知道哪个是真的,或者两者都需要一个字节相同的行工作怎么办?
[注意:我认为这种情况会发生,因为根据我的经验和观察,这通常是一个安全的假设。即使没有技术原因,PHB和立法者也是荒谬的良好来源。]
c++ - 存在重载命名空间函数时需要 std:: 限定符吗?
如果我有一些代码,例如:
那么除非我将标记的行更改为 use ,否则它将无法编译std::sqrt
。为什么?我知道如果我尝试重新定义sqrt(float)
,那么如果我想要使用标准库版本,myNamespace
我就必须符合条件。std::
编译器似乎试图转换myFloat
而不是仅仅使用另一个 ( std
) 命名空间中的函数。
我发现解决这个问题的一种方法是sqrt(vector<float>)
在std
命名空间中定义,但这感觉不太对,对这个问题的回答表明重载std
是非法的。那时应该不会走的路……
我怎样才能重载sqrt
(或任何其他标准库 cmath 函数,就此而言),以便我不必总是限定要使用哪个并让编译器根据传递的函数参数进行选择?
谢谢。