[C++] boost::thread хрень какая-то

erotic

 
 
#include <boost/thread.hpp>
#include <iostream>

using namespace boost;
using namespace std;

void f
{
cout << "Thread started" << endl;
sleep(3);
cout << "Thread stopped" << endl;
}

class F
{
public:
F { cout << "F" << endl; }
F(const F&) { cout << "F(const& F)" << endl; }
F& operator= (const F&) { cout << "F& operator=(const F&)" << endl; return *this; }
~F { cout << "~F" << endl; }
void operator
{
a = 5;
f;
}
int a;
};

int main
{
{
F sf;
thread t(sf);
sleep (2);
}
cout << "Thread object destroyed" << endl;
sleep (2);
return 0;
}

 g++ boost_thread.cpp -lboost_thread -g -O0
./a.out:
 
 F
F(const& F)
F(const& F)
F(const& F)
~F
Thread started
~F
~F
Thread object destroyed

Thread stopped
~F

Если заменить кусок "F sf; thread t(sf);" на просто "thread(F;", то программа выдает только это:
 
 Thread object destroyed 

Не пойму никак, где конструкторы, где деструкторы, почему не вызывается f...
boost 1.35.0, gcc 4.1.2, amd64.

kokoc88

Если заменить кусок "F sf; thread t(sf);" на просто "thread(F;", то программа выдает только это:
От тебя я этого не ожидал. :) Только что в соседнем треде объяснял, что F - это прототип функции. В твоём случае вообще вся строка становится прототипом функции.

Dasar

thread(F;
скорее всего наследие C;
он думает, что этой строчкой - ты задекларировал функцию.

erotic

От тебя я этого не ожидал.
А ты будь всегда начеку %)
Спасибо, давно с этой хренью не встречался, забыл уж :(
Все из-за того, что все больше по работе не программированием приходится заниматься, а всякой хуетой

erotic

он думает, что этой строчкой - ты задекларировал функцию.
А почему он не думает, что вложенные функции в C++ запрещены?

bleyman

Потому что это декларация, а не имплементация функции.

erotic

Потому что это декларация, а не имплементация функции.
Ты хочешь сказать, что "в C++ запрещены вложенные функции" означает только "в C++ запрещено имплементировать вложенные функции, но можно писать бесполезные объявления"?

kokoc88

А почему он не думает, что вложенные функции в C++ запрещены?
Он так думает. Просто в Си++ разрешены функции, которые принимают указатели на функции в качестве аргумента.

Dasar

Ты хочешь сказать, что "в C++ запрещены вложенные функции" означает только "в C++ запрещено имплементировать вложенные функции, но можно писать бесполезные объявления"?
правильнее, в C можно писать бесполезные объявления функций внутри функций
а C++ бесполезно полностью совместим с C

erotic

О боже!
lib.cpp

#include <iostream>
int g
{
std::cout << "g" << std::endl;
}

main.cpp
 
int main
{
int g;
g;
return 0;
}

g++ main.cpp lib.cpp
./a.out:
 g 

Работает! Я в шоке.

procenkotanya

Интересно, а чем, по-твоему, отличаются

int main
{
int g;
g;
return 0;
}

и

int g;
int main
{
g;
return 0;
}

?

Andbar

области видимости декларации int g;
Например,
int main
{
int g;
g;
return 0;
}

int k
{
//g; //ошибка
return 0;
}

int g
{
return 0;
}

erotic

Интересно, а чем, по-твоему, отличаются
Тем, что это непонятно совсем. Например: почему я могу объявить внешнюю функцию внутри другой функции? Почему тогда я не могу там ее определить, сделав полностью локальной? Почему я не могу внутри main.cpp объявить функцию не из глобального пространства имен? Зачем вообще этот аппендикс нужен, кроме как для внесения путаницы?

Andbar

как вариант - ни за чем, просто не стали добавлять это ограничение. Получилось как побочный результат более общих определений, таких как блоков области видимости и объявлений различных сущностей (тех-же переменных) в различных местах.
Не используй.
Язык вовсе не обязан иметь средства защиты от плохого программирования.

erotic

Язык вовсе не обязан иметь средства защиты от плохого программирования.
Эти побочные эффекты приводят к ситуациям, когда я смотрю на код и вижу его смысл в одном, а компилятор - совсем в другом, вот что мне не нравится. Из-за этого, как видишь, происходят нелепые ошибки.

Andbar

я смотрю на код и вижу его смысл в одном, а компилятор - совсем в другом
То есть, ты допускаешь, что к объявлению переменных ставились "" без существенной причины?

bleyman

объявлению переменных ставились "" без существенной причины?
Почему же без существенной...
MyClass a(10); // constructor
MyClass a; // function declaration
Неаккуратненько!

vall

это проблемы с++ а не с

Andbar

напиши разработчикам gcc, cl, а также других компиляторов просьбу добавить нотайс предупреждающий о том, что этим пользоваться не следует
Оставить комментарий
Имя или ник:
Комментарий: