问题标签 [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++ - 带有来自另一个命名空间的 typedef 的 ADL
我有这样的事情:
这自然是行不通的,因为 ADL 找不到,operator<<
因为namespace N
没有关联MyPair
(很遗憾)。Afaik 可能不会添加到命名空间 std,所以如果我选择operator <<
在 std 中定义那将是非法的。那么......在这种情况下该怎么办?我不想明确限定operator <<
,也不想写using namespace N
。所以,问题是:
- 如何重构代码?
- 为什么 ADL 不关联 typedef 的命名空间?严重的原因?这会很好,例如在这种情况下。谢谢
c++ - 为什么发明了参数依赖查找?
为什么发明了参数依赖查找(ADL)?只是为了我们可以写cout << stuff
而不是std::operator<<(cout, stuff)
?如果是这样,为什么 ADL 不限于运算符而不是所有函数?
如果 C++ 有其他方法可以对内置类型和用户定义类型进行通用输出,例如printf
通过可变参数模板实现类型安全,是否可以阻止 ADL 的引入?
c++ - Koenig 查找的基本原理
Koenig 查找的基本原理是什么?
无法避免将其视为使您的代码更难阅读且更不稳定的东西。
难道他们不能定义 Koenig 查找,使其仅适用于特定情况(即:非成员运算符)或明确需要时?
c++ - C++ 运算符查找规则/Koenig 查找
在编写测试套件时,我需要提供operator<<(std::ostream&...
Boost 单元测试的实现以供使用。
这有效:
这没有:
显然,当 g++ 尝试解决运算符的使用时,第二个不包含在候选匹配中。为什么(什么规则导致这个)?
代码调用operator<<
在 Boost 单元测试框架中很深,但这里是测试代码:
作为参考,我使用的是 g++ 4.4(尽管目前我假设这种行为符合标准)。
c++ - 在类方法实现的主体中使用 std::swap 是什么意思?
在对这个问题的彻底解释之后,我试图学习和采用复制交换成语: Copy-Swap Idiom。
但我发现了一些我从未见过的代码:using std::swap; // allow ADL
在这个例子中
using std::swap;
函数实现的主体内部是什么意思?- ADL 是什么意思?
c++ - 具有类参数的函数从命名空间中泄漏?
我在这里有一小段代码供您考虑,这让我很困惑。奇怪的是它可以在 Sun Studio 和 GCC 上编译,尽管我认为它不应该。
考虑一下:
来自同一命名空间的类参数会导致函数f
“泄漏”出命名空间,并且可以在没有name::
.
有人对此有解释吗?肯定是我,而不是编译器在这里出错。
c++ - C++ 中参数依赖名称查找的规则
最近关于 ADL 的一些关于 SO 的问题让我思考。基本上,我很困惑编译器在执行 ADL 时可以搜索哪些头文件?它是仅包含在用户代码中的那些,还是可以包含其他头文件,其中与用户代码中使用的名称空间相同?例如。std
命名空间跨越多个头文件。但是,我可能只包括其中的一部分。现在,如果我定义一个不在此头文件子集中但在std
名称空间中(在我未包含的文件中)的函数,它仍然是一个模棱两可的调用吗?我之所以有这个疑问,主要是因为关于这个问题的讨论
parameters - SCORM 2004 ADL 测试套件错误
tldnr:需要一个变体以允许在组织项目的参数对象中使用“/”;
在进行“内容包一致性测试”时,对于参数属性,我收到以下错误。这是内容起作用的必要属性,但只要我在其中有“/”就不会验证。我已经在 SCORM 云上测试了这个包,它按预期加载和启动,但我还需要验证它。有没有我可以使用的变体来保持“/”但允许它被正确验证?
错误:[?first=0&dir=dir/subdir] 不符合 IMS CP 1.1.4 和 SCORM 为“参数”属性定义的语法
尝试的变体:
?dir=dir//subdir&first=0 //同样的错误
?dir=dir\/subdir&first=0 //同样的错误
?dir=dir\subdir&first=0 //同样的错误
?dir=dir/subdir&first=0 / /same error
?dir=dir⁄subdir&first=0 //使 xml 无效
另外尝试:
%3Ffirst%3D0%26wd%3Ddir%2Fsubdir //同样的错误
?first=0&wd=dir%2Fsubdir //同样的错误
c++ - 基于范围的 for 循环和 ADL
C++0x 标准工作草案陈述(第6.5.4 节)以下关于隐含在基于范围的 for 循环中的 begin() 和 end() 调用:
'begin' 和 'end' 使用参数相关查找 (3.4.2) 进行查找。出于此名称查找的目的,命名空间 std 是一个关联的命名空间。
按照我的阅读方式,这意味着为调用 begin() 和 end() 设置的重载解决方案包括以下所有内容:
- begin() 和 end() 的所有重载都在使用基于范围的 for 循环的位置范围内(特别是,全局命名空间中的所有重载都将在范围内)
- 命名空间 std 中 begin() 和 end() 的所有重载
- 与其参数关联的其他命名空间中的 begin() 和 end() 的所有重载
那是对的吗?
g++ 4.6 的行为似乎与这种解释不一致。对于此代码:
它给出了以下错误:
这表明它只考虑命名空间 std 中的重载,而不考虑全局命名空间中的重载。
但是,如果我使用在全局命名空间中声明的我自己的 pair 类,它编译得很好:
作为最终测试,我尝试将 my_pair 放在单独的命名空间中:
我再次得到错误:
因此,它似乎只考虑命名空间 std 和其他相关命名空间中的重载,而不考虑调用站点范围内的重载(我上面列表中的第一个要点)。
这是一个 gcc 错误,还是我误解了标准?
如果是后者,这是否意味着不可能将 std::pair 对象视为基于范围的 for 循环中的范围(不重载 std::begin() 和 std::end(),如果我不是错误是不允许的)?