Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::addressof

      From cppreference.com
      <cpp‎ |memory
       
       
      Memory management library
      (exposition only*)
      Allocators
      Uninitialized memory algorithms
      Constrained uninitialized memory algorithms
      Memory resources
      Uninitialized storage(until C++20)
      (until C++20*)
      (until C++20*)
      Garbage collector support(until C++23)
      (C++11)(until C++23)
      (C++11)(until C++23)
      (C++11)(until C++23)
      (C++11)(until C++23)
      (C++11)(until C++23)
      (C++11)(until C++23)
       
      Defined in header<memory>
      template<class T>
      T* addressof( T& arg)noexcept;
      (1)(since C++11)
      (constexpr since C++17)
      template<class T>
      const T* addressof(const T&&)= delete;
      (2)(since C++11)
      1) Obtains the actual address of the object or functionarg, even in presence of overloadedoperator&.
      2) Rvalue overload is deleted to prevent taking the address ofconst rvalues.

      The expressionstd::addressof(e) is aconstant subexpression, ife is an lvalue constant subexpression.

      (since C++17)

      Contents

      [edit]Parameters

      arg - lvalue object or function

      [edit]Return value

      Pointer toarg.

      [edit]Possible implementation

      The implementation below is notconstexpr, becausereinterpret_cast is not usable in a constant expression. Compiler support is needed (see below).

      template<class T>typenamestd::enable_if<std::is_object<T>::value, T*>::type addressof(T& arg)noexcept{returnreinterpret_cast<T*>(&const_cast<char&>(reinterpret_cast<constvolatilechar&>(arg)));} template<class T>typenamestd::enable_if<!std::is_object<T>::value, T*>::type addressof(T& arg)noexcept{return&arg;}

      Correct implementation of this function requires compiler support:GNU libstdc++,LLVM libc++,Microsoft STL.

      [edit]Notes

      Feature-test macroValueStdFeature
      __cpp_lib_addressof_constexpr201603L(C++17)constexprstd::addressof

      constexpr foraddressof is added byLWG2296, and MSVC STL applies the change to C++14 mode as a defect report.

      There are some weird cases where use of built-inoperator& is ill-formed due toargument-dependent lookup even if it is not overloaded, andstd::addressof can be used instead.

      template<class T>struct holder{ T t;}; struct incomp; int main(){    holder<holder<incomp>*> x{};// &x; // error: argument-dependent lookup attempts to instantiate holder<incomp>    std::addressof(x);// OK}

      [edit]Example

      operator& may be overloaded for a pointer wrapper class to obtain a pointer to pointer:

      Run this code
      #include <iostream>#include <memory> template<class T>struct Ptr{    T* pad;// add pad to show difference between 'this' and 'data'    T* data;    Ptr(T* arg): pad(nullptr), data(arg){std::cout<<"Ctor this = "<< this<<'\n';}     ~Ptr(){ delete data;}    T** operator&(){return&data;}}; template<class T>void f(Ptr<T>* p){std::cout<<"Ptr   overload called with p = "<< p<<'\n';} void f(int** p){std::cout<<"int** overload called with p = "<< p<<'\n';} int main(){    Ptr<int> p(newint(42));    f(&p);// calls int** overload    f(std::addressof(p));// calls Ptr<int>* overload, (= this)}

      Possible output:

      Ctor this = 0x7fff59ae6e88int** overload called with p = 0x7fff59ae6e90Ptr   overload called with p = 0x7fff59ae6e88

      [edit]Defect reports

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

      DRApplied toBehavior as publishedCorrect behavior
      LWG 2598C++11std::addressof<const T> could take address of rvaluesdisallowed by a deleted overload

      [edit]See also

      the default allocator
      (class template)[edit]
      [static]
      obtains a dereferenceable pointer to its argument
      (public static member function ofstd::pointer_traits<Ptr>)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/memory/addressof&oldid=176411"

      [8]ページ先頭

      ©2009-2025 Movatter.jp