я работал над программой недавно, которая выглядит следующим образом: -проверка константность с использованием type_traits
#include <iostream>
#include <memory>
#include <type_traits>
#include <typeinfo>
using namespace std;
int main()
{
shared_ptr<int> sp1 = make_shared<int>(5);
shared_ptr<const int> sp2 (sp1);
const int x = 8;
// *sp2 = 7; // error: assignment of read-only location 'sp2.std::shared_ptr<const int>::<anonymous>.std::__shared_ptr<_Tp, _Lp>::operator*<const int, (__gnu_cxx::_Lock_policy)2u>()'
auto p = sp2.get();
cout << typeid(x).name() << '\t' << typeid(*p).name() << '\n';
cout << boolalpha;
cout << is_const<decltype(*p)>::value << '\n' << is_same<const int, decltype(*p)>::value;
return 0;
}
Вывод этой программы является: -
i i
false
false
Как видно ясно, typeid
указывает, что *p
& x
имеют одинаковый тип &, используя *sp2 = 7
. Тогда почему std::is_same
& std::is_const
отличается от этого?
nvm, confused 'p' /' sp'.Хотя я бы пошел на 'remove_pointer' в этом случае (или перейдите через 'pointer_traits :: element_type', хотя это может быть излишним - у него есть преимущество работы как с простыми, так и с умными указателями). –
@ T.C. хорошо, это имеет смысл, отредактировал ответ –
круто, спасибо тонну !!! – Anwesha