首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么adl优先使用'boost::range_detail::operator|‘而不是本地的'operator|'?

adl优先使用'boost::range_detail::operator|'而不是本地的'operator|',是因为ADL(Argument-Dependent Lookup,参数相关查找)规则的影响。

ADL是C++中的一种查找规则,它在函数调用时会考虑到参数的命名空间,从而在调用函数时会自动查找与参数相关的函数。当使用'operator|'进行函数调用时,编译器会首先在参数的命名空间中查找与之相关的函数。

在这个问题中,adl优先使用'boost::range_detail::operator|'而不是本地的'operator|',是因为'boost::range_detail::operator|'是与参数相关的函数,而本地的'operator|'可能不在参数的命名空间中。

'boost::range_detail::operator|'是Boost库中的一个函数,它用于处理范围操作,例如对容器进行过滤、映射等操作。它具有丰富的功能和灵活性,可以方便地对容器进行各种操作。

推荐的腾讯云相关产品和产品介绍链接地址:

请注意,以上链接仅供参考,具体产品选择应根据实际需求进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

c++11-17 模板核心知识(十三)—— 名称查找与ADL

this->count就是一个qualified name,但count不是,因为它作用域没有被显示指明,即使它和this->count是等价。 dependent name:依赖于模板参数。...在函数调用表达式中(f(a1, a2, a3, ... ),包含隐式调用重载operator,例如 << ),ADL应用一系列规则来查找unqualified function names。...ADL会将函数表达式中实参associated namespaces和associated classes加入到查找范围,这也就是为什么叫Argument-Dependent Lookup....理解为什么需要ADL、什么时候应用到ADL时,按照对应场景再去查就行~ 额外需要注意一点是,ADL会忽略using : #include namespace X { template...ADL缺点 依赖ADL有可能会导致语义问题,这也是为什么有的时候需要在函数前面加::,或者一般推荐使用xxx::func,不是using namespace xxx 。

68330

(大boss)C++惯用法之copy-swap

C++惯用法之copy-swap 为什么我们需要复制和交换习惯? 任何管理资源类(包装程序,如智能指针)都需要实现big three。尽管拷贝构造函数和析构函数目标和实现很简单。...从概念上讲,它通过使用拷贝构造函数功能来创建数据本地副本,然后使用交换功能获取复制数据,将旧数据与新数据交换来工作。然后,临时副本将销毁,并随身携带旧数据。我们剩下是新数据副本。...交换函数是一种不抛异常函数,它交换一个类两个对象或者成员。我们可能很想使用std :: swap不是提供我们自己方法,但这是不可能。...(不仅如此,对swap无条件调用将使用我们自定义swap运算符,从而跳过了std :: swap会导致不必要类构造和破坏。)...= rhs) { delete ptr_; ptr_ = new T(rhs.ptr_); // 当new 发生异常,此时ptr_指向而是一块被删除区域,不是被赋值对象区域

1.6K20
  • copy-and-swap 是什么

    回答 为什么需要 copy-and-swap 呢? 任何资源管理类(比如智能指针)都需要遵循一个规则:三法则。...其中复制构造函数和析构函数实现起来比较容易,但是赋值运算符(=)要复杂许多, copy-and-swap 就是实现赋值运算符(=)完美解决方案。它既能避免代码冗余,还可以提供 强异常安全保证。...(译注:我随后查看了 boost、folly 和 MSVC 实现,它们都加上了自判断检查。) 序号(2)处:仅提供了基本异常安全保证。...friend void swap(dumb_array& first, dumb_array& second) // nothrow { // enable ADL (not necessary...另外有人疑问 dumb_array& operator=(dumb_array other) 参数是值传递,也可以换成引用传递嘛,就像下面这样, dumb_array& operator=(const

    86610

    C++核心准则T.47:避免使用通用名称高度不受限模板

    T.47: Avoid highly unconstrained templates with common names T.47:避免使用通用名称高度不受限模板 Reason(原因) An unconstrained...不受限模板参数会完美匹配任何东西,因此这样模板可以覆盖需要轻微转换特定类型。当使用ADL时,这种情况很麻烦/危险。通用名称会让这个问题更容易发生。...现在Bad中==被设计用于引发问题,但是你能定位到实际代码中问题么?问题是v.size()返回一个无符号整数,因此调用本地==时需要转换;Bad中==则不需要转换。...如果不受限模板被定义在类型相同命名空间,这个不受限模板可以被ADL发现(就像示例代码中发生那样。)。也就是说,它是高度可见。...本规则应该是没有必要,但是委员会不能同意将非受限模板从ADL中排除出去。

    46630

    C++为什么有参数依赖查找(ADL)?

    其中 xxx.cc 是库源文件, yyy.h 是复杂项目自身源文件。这里引起了我们兴趣:编译器为什么会找到一个命名空间,什么是 name lookup ?...特例是对模版参数中名字,会在当前作用域查找,不是模版名称作用域 c 代码解读复制代码namespace N { template struct foo {}...如果左侧找到名称不是指一个命名空间或类、枚举或依赖类型,程序是不正确(ill-formed)。当限定名称用作声明时,对跟随该限定名称同一声明中使用名称进行非限定查找,但不对前置名称进行查找。...为什么C++会有ADL为什么在限定名称查找和非限定名称查找之外,C++还要提供参数依赖查找这样机制呢?...历史原因:ADL是C++早期版本中就已经存在特性,它随着语言发展逐渐演化,成为C++中不可或缺一部分。

    10410

    现代C++之ADL

    什么是“依赖于参数查询”(又名ADL或“ Koenig查找”)? Koenig查找或参数依赖查找描述了C ++编译器如何查找不合格名称 。...它是如何工作? 该算法告诉编译器不仅要查看本地作用域,还要查看包含参数类型名称空间。...如果没有Koenig查找,那么程序员将不得不负担重复指定完全限定名称费用,或者使用大量using声明。 为什么批评Koenig查找?...使用Koenig查找时,使用此算法时必须谨慎,因为: std::swap(obj1,obj2); 可能不会显示以下行为: using std::swap; swap(obj1, obj2); 使用ADL...如果存在命名空间A,并且存在A::obj1,A::obj2和A::swap(),则第二个示例将导致对A::swap()调用,这可能不是用户想要

    1.6K30

    C++那些事之ADL

    什么是“依赖于参数查询”(又名ADL或“ Koenig查找”)? Koenig查找或参数依赖查找描述了C ++编译器如何查找不合格名称 。...它是如何工作? 该算法告诉编译器不仅要查看本地作用域,还要查看包含参数类型名称空间。...如果没有Koenig查找,那么程序员将不得不负担重复指定完全限定名称费用,或者使用大量using声明。 为什么批评Koenig查找?...使用Koenig查找时,使用此算法时必须谨慎,因为: std::swap(obj1,obj2); 可能不会显示以下行为: using std::swap; swap(obj1, obj2); 使用ADL...如果存在命名空间A,并且存在A::obj1,A::obj2和A::swap(),则第二个示例将导致对A::swap()调用,这可能不是用户想要

    97510

    线程本地存储-The Boost C++ Libraries

    ,翻译这篇博文时Boost最新版本是1.73.0 线程本地存储 线程本地存储(TLS)是专用存储区,只能由一个线程访问。...一旦创建了boost::thread_specific_ptr类型变量,就可以对其进行设置。该变量需要布尔类型变量地址,不是变量本身地址。...因为boost :: thread_specific_ptr存储一个地址,所以此类行为类似于指针。例如,它提供了成员函数operator *和operator->,它们可以像使用指针一样工作。...因为使用了TLS变量,所以每个线程都使用自己变量tls。当第一个线程使用指向动态分配布尔变量指针初始化tls时,第二个线程和第三个线程中tls变量仍未初始化。...由于TLS变量是每个线程全局不是每个进程全局,因此在一个线程中使用tls不会更改任何其他线程中变量。

    1.1K30

    C++ 新特性学习(二) -- Array、Tuple和Hash库

    这回两个库没怎么用过,这里记录就用VC++写了,使用G++和BOOST时候和智能指针类似。...首先是Tuple库 要注意是这里G++,VC++和BOOST函数不太一样,所以使用时候要注意没有使用到编译器和编译器相关函数(特别是IDE弹窗方法要注意)。...比如VC++和G++里tuple对象没有get方法,boost里有,所以获取数据智能用get(tuple&)语句。 这是个多元数组,最多有10个元素,用于方便定义复杂逻辑结构。...普通数组不支持STL,当std::vector效率不满足需求时候array力量就出来了,使用不是一般简单。...&)方法或函数,我使用boost库正常,但是VC++下用tr1编译错误,错误在自定义hash函数上,但没看懂报错原因,也没有详细例子或文档。

    1.1K10

    C++最佳实践 | 2. 代码风格

    使用nullptr C++11引入了nullptr表示空指针,应该用来代替0或NULL来指示空指针。 注释 注释块应该使用//,不是/* */,使用//可以更容易在调试时注释掉代码块。...使用""表示include本地文件 ...表示include系统文件[11]。 // Bad Idea....,否则优先使用{}初始化,不是=。...由于宏有不遵守命名空间等问题,因此能用模板地方就不要用宏。 明智使用操作符重载 运算符重载是为了支持表达性语法。比如让两个大数相加看起来像a + b,不是a.add(b)。...对于所有其他操作符,通常只有在需要在上下文中使用时才重载。典型场景是用+连接事物,负号可以被认为是“真”或“假”表达式,等等。 一定要注意操作符优先级[15],尽量避免不直观结构。

    1.2K10

    C++ 智能指针详解

    当我们不想让 my_memory 继续生存下去,我们调用 release() 函数释放内存,结果却导致内存泄露(在内存受限系统中,如果my_memory占用太多内存,我们会考虑在使用完成后,立刻归还,不是等到...总结:std::auto_ptr 可用来管理单个对象对内存,但是,请注意如下几点: (1)    尽量不要使用operator=”。如果使用了,请不要再使用先前对象。...首先 boost::weak_ptr 是专门为 boost::shared_ptr 准备。有时候,我们只关心能否使用对象,并不关心内部引用计数。...,不改变其引用计数,当被观察 boost::shared_ptr 失效后,相应 boost::weak_ptr 也相应失效。...,用于指向子类boost::shared_ptr,这样基类仅仅观察自己 boost::weak_ptr 是否为空就知道子类有没对自己赋值了,不用影响子类 boost::shared_ptr 引用计数

    1.9K10

    Boost C++ 库 | 智能指针(RAII、作用域指针、作用域数组)

    智能指针确保在任何情况下,动态分配内存都能得到正确释放,从而将开发人员从这项任务中解放了出来。这包括程序因为异常中断,原本用于释放内存代码被跳过场景。...在你示例中,使用 PROCESS_SET_INFORMATION,这意味着请求设置进程信息权限(例如,改变进程优先级)。...在你示例中,使用 PROCESS_SET_INFORMATION,这意味着请求设置进程信息权限(例如,改变进程优先级)。...在不需要所有权传递时候应该优先使用 boost::scoped_ptr 。在这些情况下,比起 std::auto_ptr 它是一个更好选择,因为可以避免不经意间所有权传递。...可以通过 operator[]() 操作符访问数组中特定元素,于是 boost::scoped_array 类型对象行为就酷似它所含数组。

    10710

    C++ 智能指针

    当我们不想让 my_memory 继续生存下去,我们调用 release() 函数释放内存,结果却导致内存泄露(在内存受限系统中,如果my_memory占用太多内存,我们会考虑在使用完成后,立刻归还,不是等到...由于 std::auto_ptr 引发了诸多问题,一些设计并不是非常符合 C++ 编程思想,所以引发了下面 boost 智能指针,boost 智能指针可以解决如上问题。 让我们继续向下看。...首先 boost::weak_ptr 是专门为 boost::shared_ptr 准备。有时候,我们只关心能否使用对象,并不关心内部引用计数。...,不改变其引用计数,当被观察 boost::shared_ptr 失效后,相应 boost::weak_ptr 也相应失效。...,用于指向子类 boost::shared_ptr,这样基类仅仅观察自己 boost::weak_ptr 是否为空就知道子类有没对自己赋值了,不用影响子类 boost::shared_ptr 引用计数

    1K40

    C++:智能指针

    一、智能指针使用及原理 1.1 为什么需要智能指针 在学习异常时候,我们知道了由于异常反复横跳可能会导致内存泄露问题,但是对于一些自定类类型来说他在栈帧销毁时候会去调用对应析构函数...如果不是0,就说明除了自己还有其他对象在使用该份资源,不能释放该资源,否则其他对象就成野指针了。 易错点1:引用计数应该如何表示???...,然后再使用wake_ptr来解决这个场景 1.9 shared_ptr定制删除器 为什么需要定制删除器呢??...C++ boost给出了更实用scoped_ptr和shared_ptr和weak_ptr. 3. C++ TR1,引入了shared_ptr等。不过注意是TR1并不是标准版。 4....可以把boost库理解成体验服 三、内存泄露 3.1 什么是内存泄漏,内存泄漏危害 什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用内存情况。

    10200

    使用Kube Startup CPU Boost加速Kubernetes工作负载启动时间

    一个选择是配置更大请求以满足峰值资源需求。这不是一种最佳方法,会导致资源利用不足。它还会产生不必要基础设施成本,因为并非所有时间都在使用。...Java 虚拟机资源使用模式 Java 应用程序通常需要随时间变化不同资源。Java 是一种动态、解释型语言,基于“一次编写,到处运行”原则。...它通过生成通用字节码不是特定架构机器码来实现这一点,需要 Java 虚拟机(JVM)来运行应用程序。JVM 在启动时通常需要更多资源,而在运行时则需要更少。...受益于 in-place resource resize 解决方案之一是 Kube Startup CPU Boost,这是一个 Kubernetes operator ,用于增加 Pod CPU...新 Kubernetes in-place POD 调整功能旨在解决这个问题, Kube Startup CPU Boost 解决方案演示了如何利用这一新功能。

    7600

    Boost asio 官方教程

    请留意,我们只是传入了 handler() 函数名字,该函数本身并没有被调用。 async_wait() 好处是,该函数调用会立即返回,不是等待五秒钟。...一旦闹钟时间到,作为参数所提供函数就会被相应调用。 因此,应用程序可以在调用了 async_wait() 之后执行其它操作,不是阻塞在这里。...由于域名解析不是发生在本地,所以它也被实现为一个异步操作。 一旦域名解析成功或被某个错误中断,resolve_handler() 函数就会被调用。...它与原来 boost::asio::deadline_timer 区别在于,计时器时长是作为参数传递给 wait() 或 async_wait() 方法不是传给构造函数。...在实践上,应该优先使用 boost::asio::deadline_timer,因为它已经集成在 Boost.Asio 中了。

    17.6K71

    boost信号槽原理和实践

    (在实时forloop中怎么安排每项事情) boost signal2提供了这么一种高性能底层库。这里我觉得在一些场景下,boost signal2也是不错选择。...二、boost设计原理 2.1 boost signal2一些设计亮点 “类型擦除”,即通过使用动态分派接口消除静态类型信息,在 Boost.Signals 库中广泛使用,以减少模板实例化生成代码量...为了对抗这种所谓“模板膨胀”,使用 Boost.Function 和 Boost.Any 来存储未知类型和操作。...Boost.Signals2 可以指定多个返回值绑定 Signals2使用 "pull" 模式,不是 "push" 模式....原来Boost.Signals 使用boost::signals::trackable派生类。 由于boost::signals::trackable派生类析构函数顺序先于base类析构函数。

    41410
    领券