Questions tagged «argument-dependent-lookup»


4
ADL为什么找不到功能模板?
C ++规范的哪一部分限制了依赖于参数的查找,无法在关联的命名空间集中查找函数模板?换句话说,为什么main下面的最后一个调用无法编译? namespace ns { struct foo {}; template<int i> void frob(foo const&) {} void non_template(foo const&) {} } int main() { ns::foo f; non_template(f); // This is fine. frob<0>(f); // This is not. }

6
Bjarne是否对ADL的示例有误,还是我遇到了编译器错误?
我正在阅读有关C ++编程语言的第四版(由Bjarne Stroustrup撰写),参数依赖查找。这是报价(26.3.6,过度攻击性ADL): 依赖参数的查找(通常称为ADL)对于避免冗长非常有用(14.2.4)。例如: #include <iostream> int main() { std::cout << "Hello, world" << endl; // OK because of ADL } 如果没有依赖于参数的查找,endl将找不到操纵器。实际上,编译器会注意到to的第一个参数<<是在中ostream定义的std。因此,它endl在中std查找并找到它(在中<iostream>)。 这是编译器(C ++ 11模式)产生的结果: prog.cpp: In function ‘int main()’: prog.cpp:4:36: error: ‘endl’ was not declared in this scope std::cout << "Hello, world" << endl; ^ 这是编译器还是本书中的错误。标准怎么说? 更新: 我需要澄清一下。我知道正确的答案是使用std::endl。问题是关于书中的文字。正如Lachlan Easton所说,这不仅仅是错字。整个段落(可能)是错误的。如果这本书是由另一位(鲜为人知的)作者撰写的,我可以接受这种错误,但是由于(它仍然是)由Bjarne撰写,所以我一直(并且仍然)对此表示怀疑。

1
回顾C ++编译时间计数器
TL; DR 在尝试阅读整篇文章之前,请了解: 我自己已经找到解决所提出问题的方法,但是我仍然很想知道分析是否正确; 我已经将解决​​方案打包到一个fameta::counter类中,该类可以解决一些剩余的怪癖。您可以在github上找到它; 您可以在使用Godbolt上看到它。 一切如何开始 自从FilipRoséen在2015年发现/发明以来,编译计时器的黑魔法就用C ++了,我一直对这个设备有些痴迷,所以当CWG 决定必须取消功能时,我很失望,但仍然希望他们的想法通过向他们展示一些引人注目的用例可以对其进行更改。 然后,几年前,我决定再次研究一下问题,以便将uberswitch es嵌套(在我看来,这是一个有趣的用例),只是发现它不再适用于新版本的。可用的编译器,即使问题2118处于(并且仍然)处于打开状态:代码可以编译,但计数器不会增加。 在Roséen的网站上已经报告了该问题,最近在stackoverflow上也报告了该问题:C ++是否支持编译时计数器? 几天前,我决定再次尝试解决问题 我想了解编译器中发生了什么变化,这些变化使看似仍然有效的C ++不再起作用。为此,我在互联网上进行了广泛的搜索,寻找有人对此进行讨论,但无济于事。因此,我开始进行实验并得出一些结论,我在这里提出的想法是希望从这里得到比我自己更了解的反馈。 为了清楚起见,下面我将介绍Roséen的原始代码。有关其工作原理的说明,请访问他的网站: template<int N> struct flag { friend constexpr int adl_flag (flag<N>); }; template<int N> struct writer { friend constexpr int adl_flag (flag<N>) { return N; } static constexpr int value = N; }; …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.