Cthulhu
13.11.2012 14:35 work
Затестил только что компилятор из 2012 студии. Он таки перестал выдавать странные ошибки в ответ на код вроде decltype(s)(s).swap(s), но по-прежнему требует публичного деструктора у типа для std::shared_ptr<t>, даже если задан кастомный делетер. А еще ему по-прежнему срывает башню от вот этого
//shit.h
#include <functional>
namespace bee_lib {
typedef std::function<void(int, class bee_packet*)> bee_async_reply_handler;
class bee_packet {
bee_packet();
};
}
//shit.cpp
#include "shit.h"
namespace bee_lib {
bee_packet::bee_packet() {}
}
Новозаявленные фичи как-то даже страшновато тестить.
Recommended by:
@generatorglukoff: ебанись глюки однако!
std::function — это же tr1 вроде
Да ты еще больший слоупок чем я, оказывается.
а чо там?
Стандарт приняли больше года назад.
в августе, я помню
tr1 — это же просто расширение стандартной либы без изменений в язык. std::function — одно из расширений. больше я не вижу чему тут крышу сносить.
не?
Почти все то, что было в tr1, вошло в итоговый стандарт.
ну, с чего крышу сносит то?
shit.cpp(3) : error C2888: 'bee_packet::bee_packet(void)' : symbol cannot be defined within namespace 'bee_lib'
О_О
проблема не в неймспейсах, ибо у меня в 2010й всё ок работает?
Скопипасти код дословно, как я писал в /0.
O_O
ебанись!
но если сделать forward declaration то попускает
Я тебе еще лучше фокус покажу. Попробуй убрать у функции первый параметр (который инт).
фигасе, лол
а багрепорт написал уже кто-нибудь?
А хуй знает. Я как-то напишу, когда багов штук 5 станет.
Show must go on.
#include <iostream>
using namespace std;
class A
{
public:
A() { cout << "1" << endl; }
~A() { cout << "2" << endl; }
};
class B : public A
{
public:
B() { cout << "3" << endl; }
~B() { cout << "4" << endl; }
};
void func(A a) {}
int main()
{
B b;
func(b);
return 0;
}
A::A(const A&) { cout << "5" << endl; }
всё норм, как раз
Почему норм? Почему деструктор суммарно вызывается три раза? )
забавно
A(3145255)
B(3145255)
~A(3145000)
~A(3145027)
~B(3145255)
~A(3145255)
причем если добавить конструктор цопирования в A, то всё становиться норм
похоже что студия несколько раз копирует объект behind the scenes:
#include <iostream>
using namespace std;
static int c = 0;
class A
{
public:
A() { x = ++c; cout << "A(" << reinterpret_cast<unsigned int>(this) << "), x = " << x << endl; }
~A() { cout << "~A(" << reinterpret_cast<unsigned int>(this) << "), x = " << x << endl; }
//A(const A&) { cout << "A copy(" << reinterpret_cast<unsigned int>(this) << ")" << endl; }
int x;
};
class B : public A
{
public:
B() { cout << "B(" << reinterpret_cast<unsigned int>(this) << "), x = " << x << endl; }
~B() { cout << "~B(" << reinterpret_cast<unsigned int>(this) << "), x = " << x << endl; }
//B(const B&) { cout << "B copy(" << reinterpret_cast<unsigned int>(this) << ")" << endl; }
};
void func(A a) {}
int main()
{
B b;
func(b);
return 0;
}
A(3472704), x = 1
B(3472704), x = 1
~A(3472452), x = 1
~A(3472476), x = 1
~B(3472704), x = 1
~A(3472704), x = 1
Я утром посмотрел в дизассемблере. Она зачем-то вызывает деструктор A один раз внутри функции func, а второй раз уже из мейна. Очевидно, что это все валилось бы нафиг, если бы внутри A были какие-то мемберы, требующие уничтожения. Потому этот случай они у себя в тестах отловили — если добавить в A строковое поле, например, результат получается 13242, как и должно быть. Ну а кейс с такими пустыми объектами пропустили, да.
Ну и на закуску
template<int i>
struct f {
enum {res = f<i-1>::res};
};
int main()
{
int i = f<1>::res;
}
это же неограниченная рекурсия
Да. Можно ее ограничить большим числом, эффект будет такой же.
Тут два пойнта: во-первых, им стоило бы отлавливать такие случаи и говорить о бесконечности рекурсии; во-вторых, им стоило бы делать хотя бы как gcc — сообщать о том что максимальное количество рекурсивных инстанциаций превышено и давать возможность увеличить его.