问题标签 [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.

0 投票
7 回答
1999 浏览

c++ - 带有来自另一个命名空间的 typedef 的 ADL

我有这样的事情:

这自然是行不通的,因为 ADL 找不到,operator<<因为namespace N没有关联MyPair(很遗憾)。Afaik 可能不会添加到命名空间 std,所以如果我选择operator <<在 std 中定义那将是非法的。那么......在这种情况下该怎么办?我不想明确限定operator <<,也不想写using namespace N。所以,问题是:

  1. 如何重构代码?
  2. 为什么 ADL 不关联 typedef 的命名空间?严重的原因?这会很好,例如在这种情况下。谢谢
0 投票
5 回答
1231 浏览

c++ - 为什么发明了参数依赖查找?

为什么发明了参数依赖查找(ADL)?只是为了我们可以写cout << stuff而不是std::operator<<(cout, stuff)?如果是这样,为什么 ADL 不限于运算符而不是所有函数?

如果 C++ 有其他方法可以对内置类型和用户定义类型进行通用输出,例如printf通过可变参数模板实现类型安全,是否可以阻止 ADL 的引入?

0 投票
2 回答
1101 浏览

c++ - Koenig 查找的基本原理

Koenig 查找的基本原理是什么?

无法避免将其视为使您的代码更难阅读且更不稳定的东西。

难道他们不能定义 Koenig 查找,使其仅适用于特定情况(即:非成员运算符)或明确需要时?

0 投票
2 回答
3174 浏览

c++ - C++ 运算符查找规则/Koenig 查找

在编写测试套件时,我需要提供operator<<(std::ostream&...Boost 单元测试的实现以供使用。

这有效:

这没有:

显然,当 g++ 尝试解决运算符的使用时,第二个不包含在候选匹配中。为什么(什么规则导致这个)?

代码调用operator<<在 Boost 单元测试框架中很深,但这里是测试代码:

作为参考,我使用的是 g++ 4.4(尽管目前我假设这种行为符合标准)。

0 投票
3 回答
7263 浏览

c++ - 在类方法实现的主体中使用 std::swap 是什么意思?

在对这个问题的彻底解释之后,我试图学习和采用复制交换成语: Copy-Swap Idiom

但我发现了一些我从未见过的代码:using std::swap; // allow ADL在这个例子中

  1. using std::swap;函数实现的主体内部是什么意思?
  2. ADL 是什么意思?
0 投票
4 回答
1010 浏览

c++ - 具有类参数的函数从命名空间中泄漏?

我在这里有一小段代码供您考虑,这让我很困惑。奇怪的是它可以在 Sun Studio 和 GCC 上编译,尽管我认为它不应该。

考虑一下:

来自同一命名空间的类参数会导致函数f“泄漏”出命名空间,并且可以在没有name::.

有人对此有解释吗?肯定是我,而不是编译器在这里出错。

0 投票
5 回答
803 浏览

c++ - C++ 中参数依赖名称查找的规则

最近关于 ADL 的一些关于 SO 的问题让我思考。基本上,我很困惑编译器在执行 ADL 时可以搜索哪些头文件?它是仅包含在用户代码中的那些,还是可以包含其他头文件,其中与用户代码中使用的名称空间相同?例如。std命名空间跨越多个头文件。但是,我可能只包括其中的一部分。现在,如果我定义一个不在此头文件子集中但在std名称空间中(在我未包含的文件中)的函数,它仍然是一个模棱两可的调用吗?我之所以有这个疑问,主要是因为关于这个问题的讨论

0 投票
1 回答
397 浏览

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 //同样的错误

0 投票
3 回答
1098 浏览

c++ - 是否有使用 operator< 打印元组和对的合法方法

我有一组模板/函数,允许我打印一个元组/对,假设元组/对中的每种类型都已为其operator<<定义。不幸的是,由于 17.4.3.1,将我的operator<<重载添加到std. 还有其他方法可以让 ADL 找到我的operator<<吗?如果没有,将我的超载包裹在 中是否有任何实际危害namespace std{}

任何有兴趣的人的代码:(我使用的是 gcc-4.5)

编译上述产量:

test.cpp:在函数'int main()'中:
test.cpp:69:31:错误:无法将'std::ostream'左值绑定到'std::basic_ostream&&'> /opt/local/include/gcc45/c++ /ostream:579:5: 错误:初始化 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) 的参数 1 [with _CharT = char , _Traits = std::char_traits, _Tp = std::tuple]'


危害是其他人(例如在您要使用的第三方库中)也将这些声明添加到 std。即使他们的行为相同,您也会违反 ODR。

只需将这些放在项目的命名空间中:

然后你项目中的任何东西都可以使用它们。

我仍然不确定为什么这对你不起作用,但似乎你想要这样的东西:

0 投票
1 回答
1673 浏览

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(),如果我不是错误是不允许的)?