// Copyright (C) 2016-2025 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License along // with this library; see the file COPYING3. If not see // . // { dg-do compile { target c++11 } } #include struct Tag { }; template struct TaggingAllocator { using value_type = T; TaggingAllocator() = default; template TaggingAllocator(const TaggingAllocator&) { } T* allocate(std::size_t n) { return std::allocator{}.allocate(n); } void deallocate(T* p, std::size_t n) { std::allocator{}.deallocate(p, n); } template void construct(U* p, Args&&... args) { ::new((void*)p) U(Tag{}, std::forward(args)...); } template void destroy(U* p) { p->~U(); } }; template bool operator==(const TaggingAllocator&, const TaggingAllocator&) { return true; } template bool operator!=(const TaggingAllocator&, const TaggingAllocator&) { return false; } struct X { // All constructors must be passed the Tag type. // DefaultInsertable into vector>, X(Tag) { } // CopyInsertable into vector>, X(Tag, const X&) { } // MoveInsertable into vector>, and X(Tag, X&&) { } // EmplaceConstructible into vector> from args. template X(Tag, Args&&...) { } // not DefaultConstructible, CopyConstructible or MoveConstructible. X() = delete; X(const X&) = delete; X(X&&) = delete; // CopyAssignable. X& operator=(const X&) { return *this; } // MoveAssignable. X& operator=(X&&) { return *this; } private: // Not Destructible. ~X() { } // Erasable from vector>. friend class TaggingAllocator; }; template class std::vector>; void test01() { std::vector> v; v.reserve(3); v.emplace_back(); v.emplace(v.begin()); v.emplace(v.begin(), 1, 2, 3); }