We don't need separate overloads for returning a const or non-const pointer. We can make the member function const and return a non-const pointer, and let `vector::data() const` convert it to const as needed.
libstdc++-v3/ChangeLog: * include/bits/stl_vector.h (vector::_M_data_ptr): Remove non-const overloads. Always return non-const pointer. --- Tested x86_64-linux. libstdc++-v3/include/bits/stl_vector.h | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h index e284536ad31..8982ca2b9ee 100644 --- a/libstdc++-v3/include/bits/stl_vector.h +++ b/libstdc++-v3/include/bits/stl_vector.h @@ -2034,20 +2034,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER _M_data_ptr(_Ptr __ptr) const { return empty() ? nullptr : std::__to_address(__ptr); } #else - template<typename _Up> - _Up* - _M_data_ptr(_Up* __ptr) _GLIBCXX_NOEXCEPT - { return __ptr; } - template<typename _Ptr> value_type* - _M_data_ptr(_Ptr __ptr) - { return empty() ? (value_type*)0 : __ptr.operator->(); } - - template<typename _Ptr> - const value_type* _M_data_ptr(_Ptr __ptr) const - { return empty() ? (const value_type*)0 : __ptr.operator->(); } + { return empty() ? (value_type*)0 : __ptr.operator->(); } #endif }; -- 2.46.2