argument-dependent-lookup相关内容
假设以下代码: #include 使用命名空间标准;命名空间 X{A类{};无效 f(A a){}无效 g(int a){}}主函数(){X::A 一个;F A);克(5);} 当我编译代码时,出现以下编译错误: main.cpp:在函数'int main()'中: main.cpp: 错误: 'g' 未在此范围内声明 所以函数 f 被完美编译,但 g 不是.
..
前段时间我读了一篇文章,解释了参数依赖查找的几个陷阱,但我再也找不到了.这是关于获得对你不应该访问的东西的访问权或类似的东西.所以我想我会在这里问:ADL 的陷阱是什么? 解决方案 依赖于参数的查找存在很大的问题.例如,考虑以下实用程序: #include 命名空间实用程序{模板无效打印(T x){std::cout
..
当创建一个按常规规则运行的自定义容器类(即使用 STL 算法、使用行为良好的通用代码等)时,在 C++03 中实现迭代器支持和成员开始/结束函数. C++11 引入了两个新概念——基于范围的 for 循环和 std::begin/end.基于范围的 for 循环理解成员开始/结束函数,因此任何 C++03 容器都支持开箱即用的基于范围的 for.对于算法,推荐的方法(根据 Herb Sutt
..
考虑以下程序: #include #include #include #include 使用命名空间标准;//为方便起见,仅作说明typedef pair观点;//这是我对pair的专长.我称之为点istream&运营商 >>(istream & in, point & p){返回 >>p.first >>p.second;}int main(){矢量v((istream_iterator
..
按照对这个问题的详尽解释,我试图学习和采用复制交换习语:复制交换习语. 但我发现了一些我从未见过的代码:using std::swap;//在这个例子中允许 ADL class 哑数组{上市://...void swap(dumb_array& pOther)//nothrow{使用 std::swap;//允许 ADL/*
..
假设代码如下: #include 使用命名空间标准;命名空间 X{A类{};void f(A a){}void g(int a){}}int main(){X::A a;F A);克(5);} 当我编译代码时,出现如下编译错误: main.cpp:在函数“int main()"中: main.cpp: 错误: 'g' 未在此范围内声明 所以函数 f 被完美编译,但 g 不是.如何
..
关于什么是参数依赖查找有什么好的解释?许多人也称它为 Koenig Lookup. 最好我想知道: 为什么这是一件好事? 为什么这是件坏事? 它是如何工作的? 解决方案 Koenig Lookup 或 Argument Dependent Lookup,描述了编译器如何在 C++ 中查找非限定名称. C++11 标准 § 3.4.2/1 规定: 当函数调用 (5
..
在下面的C ++示例代码中,GCC 6和Clang 3.8在正确的行为上存在分歧: 这个人为设计的示例“有效"-如 test()函数中那样,在GCC中返回 o.p .在clang中,它调用(未定义的)函数 get : template类obj {bool p =假;模板
..
请考虑以下示例: 命名空间N {template结构C {};template无效的foo(C T);}模板无效条(N :: C T c){foo(c);}int main(){N :: C空隙C;条(c);} GCC和Clang都无法在C ++ 17标准下(使用 -Werror )编译此代码,因为(据我的理解)在C ++ 17 ADL中
..
我已经成功使用 cxx-prettyprint:C ++容器Pretty-Printer 记录容器值. (另请参见 Pretty-print C ++ STL容器)即使在旧的VS-2005(VC8)编译器(带有prettyprint98.hpp标头),在使用VS2017-2019时也可以很好地工作,例如使容器值在单元测试中可打印. 在研究其与Boost.Format的互操作性时,令我惊讶的是
..
如果我有一个普通的课堂,我可以在课堂内“注入”一个非自由的朋友函数。 (这只能由ADL找到。) 情况1: A类{ double p_; 朋友double f(A const& a){return a.p_;} }; 如果这是模板类,我可以做: 情况2: template A类{ double p_; 朋友do
..
我有一个带有类内定义的朋友函数的类,我理想上不会修改它(它来自已部署的标头) #include #include 命名空间our_namespace { template struct our_container { 朋友our_container set_union(our_container const
..
所以我写了一个答案,该答案使用模板化函数来选择对象类型。 我定义了以下类型: struct pt { double t; double e; double c_vis; double c_invis; }; 结构pt_weighted:pt { double sigma; }; 我的模板化函数如下: 模板
..
我今天遇到一个问题,即ADL找不到在类内部定义的类型的静态成员函数。 在下面的示例中, str(foo :: Foo :: Enum)在没有显式作用域的情况下不是通过ADL定位的, foo :: Foo :: str(foo :: Foo :: Enum) 命名空间foo { struct Foo { 枚举Enum { FOO1, FOO2 }; stati
..
以下代码使用MSVC和gcc进行编译,但不能使用clang进行编译。为什么会这样? 如果 CallFoo()为 constexpr 。 template constexpr void CallFoo()//删除constexpr以修复clang编译错误。 { Foo(T()); } 类Apple {}; int main() {
..
在编写测试套件时,我需要提供 operator 这可行: 命名空间theseus {命名空间核心{ std :: ostream&运算符
..
我试图为另一个命名空间中定义的类型T定义一个相等运算符,然后在 optional 上使用相等运算符。在clang(Apple LLVM 9.1.0)上,此代码: 命名空间nsp { struct Foo { }; } bool运算符==(const nsp :: Foo& a,const nsp :: Foo& b); void foo(){ optional
..
这是来自跟进参数的跟进问题查找也只搜索名称空间或类吗?,@ DavidRodríguez在其中说:“ ADL会在类型的封闭名称空间中查找,并且还会在类型本身的内部内部”。我可能误会他想说的话,但是我正在尝试以下示例: struct foo { static无效bar(foo * z){} }; int main(){ foo * z; bar(z); }
..
#include 结构H { 无效掉期(H& rhs); }; 无效掉期交易(H& ;, H&) { std :: cout
..
我试图在 std :: pair 上使用 boost :: lexical_cast 。 #include #include #include 命名空间my { //当my_pair是用户定义的类型时,此程序将编译 //并运行,不会出现任何问题。 /
..