C++, сломай мозг
2/2/06 15:44Подарки от Вовы Мутеля - этот и следующий пост. Отсюда.
Задача - дана программа:
Вопрос: почему первый const char* распечатывается как указатель, а не так, как надо?
Я пока не смог.
Вове ответил некий истинный гуру из Apple.
Задача - дана программа:
#include <iostream>
#include <sstream>
using namespace std;
#define SFORMAT(e) ((dynamic_cast<const ostringstream&>(ostringstream() << e)).str())
int main(int argc, char* argv[])
{
cout << SFORMAT("2 x " << " 2 = " << 2*2);
return 0;
}
Никто не спрашивает, что распечатается в результате. Если вы можете это сказать, то вы не Страуструп - вы Господь Бог.Вопрос: почему первый const char* распечатывается как указатель, а не так, как надо?
Я пока не смог.
Вове ответил некий истинный гуру из Apple.
Tags:
(no subject)
2/2/06 07:41 (UTC)ofstream("foobar") << "test";Заметим, что
ofstream f("foobar"); f << "test";работает замечательно. Значит временная перменная чем-то отличается от обычной с точки зрения выбора перегрузок.
Проверим, нет ли здесь какой магии:
#include using namespace std; namespace F { struct C { C& operator<<(const void*) { cout << "*"; } }; C& operator<<(C&, const char*) { cout << "C"; } } using namespace F; int main() { C() << "test"; C c; c << "test"; }Даёт нам *C, то есть магии нет, а есть разрешение перегрузок. Дальше пока не продвинулся.
(no subject)
2/2/06 07:59 (UTC)(no subject)
2/2/06 08:03 (UTC)(no subject)
2/2/06 08:52 (UTC)И почему void* ? Хотя, вроде бы именно void* и выводится.
Re: Reply to your comment...
2/2/06 08:54 (UTC)привязать к ней rvalue C() нельзя. Раз так, то эта функция не
выбирается в качестве варианта для перегрузки.
(no subject)
2/2/06 09:25 (UTC)(no subject)
2/2/06 07:47 (UTC)(no subject)
2/2/06 07:50 (UTC)(no subject)
2/2/06 08:00 (UTC)(no subject)
2/2/06 08:34 (UTC)(no subject)
2/2/06 08:25 (UTC)первый параметр выводится в
_Myt& std::basic_ostream::operator<<(const void *_Val).
второй - уже в
template inline
basic_ostream
первый параметр выводится в
_Myt& std::basic_ostream::operator<<(const void *_Val).
второй - уже в
template<class _Traits> inline
basic_ostream<char, _Traits>& __cdecl std::operator<<(
basic_ostream<char, _Traits>& _Ostr,
const char *_Val)
почему-то неправильно(?) разрешается перегрузка.