Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      C++ named requirements:Swappable

      From cppreference.com
      <cpp‎ |named req
       
       
      C++ named requirements
       

      Any lvalue or rvalue of this type can be swapped with any lvalue or rvalue of some other type, using unqualified function callswap() in the context where bothstd::swap and the user-definedswap()s are visible.

      Contents

      [edit]Requirements

      Type U is swappable with type T if, for any object u of type U and any object t of type T,

      ExpressionRequirementsSemantics
      #include <algorithm> // until C++11

      #include <utility> // since C++11
      usingstd::swap;
      swap(u, t);

      After the call, the value oft is the value held byu before the call, and the value ofu is the value held byt before the call.Calls the function namedswap() found by overload resolution among all functions with that name that are found byargument-dependent lookup and the twostd::swap templates defined in the header<algorithm>(until C++11)<utility>(since C++11).
      #include <algorithm> // until C++11

      #include <utility> // since C++11
      usingstd::swap;
      swap(t, u);

      SameSame

      Many standard library functions (for example, many algorithms) expect their arguments to satisfySwappable, which means that any time the standard library performs a swap, it uses the equivalent ofusingstd::swap; swap(t, u);.

      Typical implementations either

      1) Define a non-member swap in the enclosing namespace, which may forward to a member swap if access to non-public data members is required.
      2) Define afriend function in-class (this approach hides the class-specific swap from name lookup other than ADL).

      [edit]Notes

      It is unspecified whether<algorithm>(until C++11)<utility>(since C++11) is actually included when the standard library functions perform the swap, so the user-providedswap() should not expect it to be included.

      [edit]Example

      Run this code
      #include <iostream>#include <vector> struct IntVector{std::vector<int> v;     IntVector& operator=(IntVector)= delete;// not assignable void swap(IntVector& other){        v.swap(other.v);} void operator()(auto rem,auto term=" "){std::cout<< rem<<"{{";for(int n{};int e: v)std::cout<<(n++?", ":"")<< e;std::cout<<"}}"<< term;}}; void swap(IntVector& v1, IntVector& v2){    v1.swap(v2);} int main(){    IntVector v1{{1,1,1,1}}, v2{{2222,2222}}; auto prn=[&]{ v1("v1",", "), v2("v2",";\n");}; //  std::swap(v1, v2); // Compiler error! std::swap requires MoveAssignable    prn();std::iter_swap(&v1,&v2);// OK: library calls unqualified swap()    prn();    std::ranges::swap(v1, v2);// OK: library calls unqualified swap()    prn();}

      Output:

      v1{{1, 1, 1, 1}}, v2{{2222, 2222}};v1{{2222, 2222}}, v2{{1, 1, 1, 1}};v1{{1, 1, 1, 1}}, v2{{2222, 2222}};

      [edit]Defect reports

      The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

      DRApplied toBehavior as publishedCorrect behavior
      LWG 226C++98it was unclear how the standard library usesswapclarified to use bothstd:: and ADL-foundswap

      [edit]See also

      checks if objects of a type can be swapped with objects of same or different type
      (class template)[edit]
      specifies that a type can be swapped or that two types can be swapped with each other
      (concept)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/named_req/Swappable&oldid=160823"

      [8]ページ先頭

      ©2009-2025 Movatter.jp