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: ебанись глюки однако!

1. generatorglukoff 13.11.2012 14:37 Воркота

std::function — это же tr1 вроде

2. Cthulhugeneratorglukoff /1 13.11.2012 14:38 work

Да ты еще больший слоупок чем я, оказывается.

3. generatorglukoffCthulhu /2 13.11.2012 14:39 Воркота

а чо там?

4. Cthulhugeneratorglukoff /3 13.11.2012 14:40 work

Стандарт приняли больше года назад.

5. generatorglukoffCthulhu /4 13.11.2012 14:41 Воркота

в августе, я помню
tr1 — это же просто расширение стандартной либы без изменений в язык. std::function — одно из расширений. больше я не вижу чему тут крышу сносить.
не?

6. Cthulhugeneratorglukoff /5 13.11.2012 14:46 work

Почти все то, что было в tr1, вошло в итоговый стандарт.

7. generatorglukoffCthulhu /6 13.11.2012 14:46 Воркота

ну, с чего крышу сносит то?

8. Cthulhugeneratorglukoff /7 13.11.2012 14:50 work

shit.cpp(3) : error C2888: 'bee_packet::bee_packet(void)' : symbol cannot be defined within namespace 'bee_lib'

9. generatorglukoffCthulhu /8 13.11.2012 14:54 Воркота

О_О
проблема не в неймспейсах, ибо у меня в 2010й всё ок работает?

10. Cthulhugeneratorglukoff /9 13.11.2012 14:54 work

Скопипасти код дословно, как я писал в /0.

11. generatorglukoffCthulhu /10 13.11.2012 15:00 Воркота

O_O
ебанись!

но если сделать forward declaration то попускает

12. Cthulhugeneratorglukoff /11 13.11.2012 15:01 work

Я тебе еще лучше фокус покажу. Попробуй убрать у функции первый параметр (который инт).

13. generatorglukoffCthulhu /12 13.11.2012 15:02 Воркота

фигасе, лол

14. generatorglukoffCthulhu /12 13.11.2012 15:03 Воркота

а багрепорт написал уже кто-нибудь?

15. Cthulhugeneratorglukoff /14 13.11.2012 15:04 work

А хуй знает. Я как-то напишу, когда багов штук 5 станет.

16. Cthulhu 14.11.2012 09:40 work

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;
}

17. generatorglukoffCthulhu /16 14.11.2012 11:02

A::A(const A&) { cout << "5" << endl; }

всё норм, как раз

18. Cthulhugeneratorglukoff /17 14.11.2012 11:04 work

Почему норм? Почему деструктор суммарно вызывается три раза? )

19. generatorglukoffCthulhu /18 14.11.2012 11:10 Воркота

забавно
A(3145255)
B(3145255)
~A(3145000)
~A(3145027)
~B(3145255)
~A(3145255)

причем если добавить конструктор цопирования в A, то всё становиться норм

20. generatorglukoffgeneratorglukoff /19 14.11.2012 11:14 Воркота

похоже что студия несколько раз копирует объект 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

21. Cthulhugeneratorglukoff /20 14.11.2012 11:35 work

Я утром посмотрел в дизассемблере. Она зачем-то вызывает деструктор A один раз внутри функции func, а второй раз уже из мейна. Очевидно, что это все валилось бы нафиг, если бы внутри A были какие-то мемберы, требующие уничтожения. Потому этот случай они у себя в тестах отловили — если добавить в A строковое поле, например, результат получается 13242, как и должно быть. Ну а кейс с такими пустыми объектами пропустили, да.

22. Cthulhu 14.11.2012 11:41 work

Ну и на закуску

template<int i>
struct f {
enum {res = f<i-1>::res};
};

int main()
{
int i = f<1>::res;
}

23. generatorglukoffCthulhu /22 14.11.2012 11:43 Воркота

это же неограниченная рекурсия

24. Cthulhugeneratorglukoff /23 14.11.2012 11:46 work

Да. Можно ее ограничить большим числом, эффект будет такой же.
Тут два пойнта: во-первых, им стоило бы отлавливать такие случаи и говорить о бесконечности рекурсии; во-вторых, им стоило бы делать хотя бы как gcc — сообщать о том что максимальное количество рекурсивных инстанциаций превышено и давать возможность увеличить его.

Do you really want to delete ?