- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
template< class T >
T* addressof(T& arg)
{
return reinterpret_cast<T*>(
&const_cast<char&>(
reinterpret_cast<const volatile char&>(arg)));
}
...
template<class T>
struct Ptr {
...
T** operator&() { return &data; }
};
int main() {
Ptr<int> p(new int(42));
f(&p); // calls int** overload
f(std::addressof(p)); // calls Ptr<int>* overload, (= this)
}
Obtains the actual address of the object or function arg, even in presence of overloaded operator&
http://en.cppreference.com/w/cpp/memory/addressof
WTF?
эти извраты выглядят как если бы кто-то разложил в проекте граблей, перекрыв оператор &. а потом кому-то еще это показалось не достаточным, и он под этими граблями еще и мин позакапывал.
но в конце это все таки разрабы которые решают этим всем говно пользоватся...
... по личному опыту, в 99% случаев, этим народ пользуется только потому что не достаточно умные/опытные что бы додуматся до нормального человеческого решения. или религия с дезайном не позволяет.
Это и есть главпроблема цпп?
А правда что сишный void* используется для тех же целей что и object в Java и C#? (передать кусок похуй чего в функцию)
Object в Java/C# — это больше, чем адрес. Он знает, какого он типа, его можно сравнить на глубое равенство с любым другим объектом и делать с ним другие непотребства. Например, использовать как мутекс. В жабе Object до сих пор используется для реализации конейнеров, но напрямую в интерфейсах он редко встречается.