问题标签 [argument-dependent-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++ - 函数模板声明顺序会影响可见性(有时)
我正在尝试创建一个函数:
其中行为根据p
传入的类型而有所不同。特别是,被getClassName
调用的版本应该取决于p
. 在以下示例中,我可以成功调用:
但是当我打电话时它失败了:
出现错误:
(GCC 4.2.4)。
如果我移动以下声明:
在 doIt 之前 - 然后它编译。所以,
- 为什么需要
getClassName( std::vector<T,A>& )
出现在之前doIt
而不是getClassName( MyClass2T<T>& )
- 我该怎么做才能
doIt
独立std::vector
?(我希望能够放置doIt
在自己的标题中,而不必了解std::vector
或任何专业化,这将是用户定义的)。
.
c++ - Koenig Lookup 的奇怪行为
考虑以下程序:
我的编译器(gcc 4.3.3)没有编译程序,因为对 size 的调用不明确。命名空间 NS2 似乎已添加到类 tmpl 中大小调用的关联命名空间集中。即使在阅读了 ISI 标准中关于 Koenig Lookup 的部分之后,我也不确定这种行为是否符合标准。是吗?有没有人知道在不使用 NS3 前缀限定大小调用的情况下解决此行为的方法?
提前致谢!
architecture - 架构描述语言经验
熟悉图形建模工具后,我最近想到了架构描述语言 (ADL) 的概念,其中以文本形式描述架构以便全面记录它。
我看到了这种方法的优势,因为它是存储在一个地方的架构的正式定义,无需一直在图形和文本编辑器之间切换。一种描述架构的 TeX 方式。
我一直在寻找,但只找到了相当过时的研究材料。
您是否有高效使用 ADL 的经验?什么有效,什么无效?
是否有支持从 ADL 生成文档的工具集?包括渲染架构图像、描述组件和接口以及组件层次结构?甚至可能用它来描述动态行为?
c++ - 在 C++ 中解析函数/方法/模板名称的偏好是什么?
如果有多种可能性,C++ 编译器如何决定调用哪个函数/方法?在我的具体情况下,我有 C++ 运行时的标准免费功能,我还有一个模板化的免费变体,如下所示:
我使用以下代码对此进行了测试:
如果我编译并运行它,似乎对 malloc 的调用被模板化变体正确替换。到现在为止还挺好。
但是,对 free 的调用并没有被模板化的变体取代,并且仍然调用了标准的 C++ 函数。
C++ 编译器使用什么规则来决定优先考虑哪个变体?这与 Koenig 查找规则有关吗?
注意:我尝试了这种替代方法,因为使用 #define 不能解决问题(请参阅问题如何使用 C 宏 (#define) 来更改调用而不是原型)。
c++ - 基于范围的语句定义冗余
查看 n3092,在第 6.5.4 节中,我们找到了基于范围的 for 循环的等价物。然后它继续说什么__begin
和__end
等于。它区分了数组和其他类型,我发现这是多余的(又名令人困惑)。
它说的是数组类型,__begin
并且__end
是您所期望的:指向第一个的指针和指向末尾的指针。然后对于其他类型,__begin
and__end
等于begin(__range)
and end(__range)
,与 ADL。命名空间std
是关联的,以便找到第24.6.5 节中定义的std::begin
和。std::end
<iterator>
但是,如果我们查看 and 的定义std::begin
,std::end
它们既是为数组定义的,也是为容器类型定义的。并且数组版本的作用与上面完全相同:指向第一个的指针,指向末尾的指针。
为什么需要将数组与其他类型区分开来,而为其他类型给出的定义也可以正常工作,找到std::begin
和std::end
?
为方便起见,一些简短的引用:
§6.5.4 基于范围的
for
语句— 如果 _RangeT 是数组类型,则 begin-expr 和 end-expr 分别是 __range 和 __range + __bound,其中 __bound 是数组边界。如果 _RangeT 是一个未知大小的数组或一个不完整类型的数组,则程序是非良构的。
— 否则,begin-expr 和 end-expr 分别是 begin(__range) 和 end(__range),其中 begin 和 end 使用参数相关查找 (3.4.2) 进行查找。出于此名称查找的目的,命名空间 std 是一个关联的命名空间。
§24.6.5 范围访问
返回:数组。
返回:数组 + N。
c++ - 为什么 ADL 找不到函数模板?
C++ 规范的哪一部分限制依赖于参数的查找在关联的命名空间集中查找函数模板?换句话说,为什么main
下面的最后一个调用无法编译?
c++ - ADL的陷阱是什么?
前段时间我读了一篇文章,解释了参数依赖查找的几个陷阱,但我再也找不到了。这是关于获得对你不应该访问的东西的访问权或类似的东西。所以我想我会在这里问:ADL 的陷阱是什么?
c++ - const char * 和 const char (& p)[T_Size] 之间的最佳查找匹配
我有两个功能:
和
给定电话:
显然,foo
使用基于堆栈的正确声明的数组调用行为符合预期,而foo
使用文字“liter. : Hello World”调用则不会,尽管两者具有相同的类型(根据 RTTI)。
符号查找选择一个重载而不是另一个重载的确切规则是什么?
为什么声明的数组和字符串文字之间的行为不同?
谢谢 !
编辑
请注意,获得所需结果的一种方法(即有一个与foo(const char (& p)[T_Size])
函数匹配的文字字符串)是删除void foo(const char *p)
并添加:
这种间接使模板化的 foo 更好地匹配字符串字面量,并且仍然使用户能够使用指针(间接将在优化编译模式下被删除)。
我在我的 g++ 4.4.3 上对其进行了测试,但我相信它在每个编译器上都会以相同的方式工作。
c++ - ADL 和朋友注入
考虑这段代码:
编译器似乎非常不同意。(MSVC08/10 说不,GCC<4.5 说是,但是 4.5 说不,sun 5.1 说是,intel 11.1 也说是,但是 comeau 说不(两者都是 EDG))。
根据“C++ 模板 - 完整指南”:
...假设涉及在关联类中查找朋友的调用实际上会导致该类被实例化...尽管这显然是编写 C++ 标准的人想要的,但标准中并未明确说明。
我在标准中找不到相关部分。有什么参考吗?
考虑这种变化:
这里的关键问题是在 ADL 期间注入的可行函数是否X<1>
应该可见X<0>
?它们有关联吗?上面提到的所有编译器都接受这个代码,除了 Comeau,它只在宽松模式下接受它。也不确定标准对此有何规定。
你对此有何看法?
c++ - 由于 ADL,对模板化函数的模糊调用
我已经被这个问题咬过几次了,我的同事也是如此。编译时
...编译第二个查找时 VS9 编译器失败。这是因为STest2
继承自 boost 命名空间中定义的类型,这会触发编译器尝试 ADL,从而找到boost::algorithm::find(RangeT& Input, const FinderT& Finder)
.
一个明显的解决方案是在调用前find(…)
加上“ ::
”,但为什么这是必要的?全局命名空间中有一个完全有效的匹配,那么为什么要调用 Argument-Dependent Lookup 呢?有人可以在这里解释理由吗?