for(;first!=last;++first)std::destroy_at(std::addressof(*first)); 2)同(1),但按照policy执行。此重载仅若std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>(C++20 前)std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>(C++20 起)为 true 才参与重载决议。
for(;first!=last;++first)std::destroy_at(std::addressof(*first)); 2)同(1),但按照policy执行。此重载不参与重载决议,除非std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>为 true 。 参数 first, last-要销毁的元素的范围 policy-所用的执行策略。细节见执行策略。
= last; ++first) std::destroy_at(std::addressof(*first));2) 同(1),但按照 policy 执行。此重载只有在满足以下所有条件时才会参与重载决议: std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> 是true。 (C++20 前) std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> ...
ForwardIt destroy_n( ForwardIt first, Size n ); (C++17 起)(C++20 前) template< class ForwardIt, class Size >constexpr ForwardIt destroy_n( ForwardIt first, Size n ); (C++20 起) template< class ExecutionPolicy, class ForwardIt, class Size >ForwardIt destroy_n( ExecutionPolicy&& policy...
{std::cout<<value<<" destructed\n";}};intmain(){alignas(Tracer)unsignedcharbuffer[sizeof(Tracer)*8];for(inti=0;i<8;++i)new(buffer+sizeof(Tracer)*i)Tracer{i};//manually construct objectsautoptr=std::launder(reinterpret_cast<Tracer*>(buffer));for(inti=0;i<8;++i)std::destroy_at(...
这并不是完美转发的问题,如果效率不高可使用 a C++03风格 construct(T*, const T&),std::alloctor的construct和的destroy被弃用是因为它们没什么用,好的C++代码应该在C++11或以后的版本直接使用它们,而且它们未添加任何的默认值, Allocator-aware containers must use allocator_traits::construct, which defers to...
在某常量表达式 e 的求值中调用 destroy_at 时,参数 p 必须指向生存期始于 e 的求值内的对象。 (C++20 起)示例下列示例演示如何用 destroy_at 销毁元素的相接序列。 运行此代码 #include <iostream> #include <memory> #include <new> struct Tracer { int value; ~Tracer() { std::cout << value <...
题外话,我个人觉得有type traits之后pseudo destructor call就是历史遗留问题了。但有人提议让pseudo ...
traits_st::destroy(allocator_int,p);// 对 int 类型而言,上面这一行可以忽略// 然而对于像std::...
struct destroy_at_fn { template<std::destructible T> constexpr void operator()(T *p) const noexcept { if constexpr (std::is_array_v<T>) for (auto &elem : *p) operator()(std::addressof(elem)); else p->~T(); } }; inline constexpr destroy_at_fn destroy_at{}; Notes destroy_...