Странное поведение транслятора
От: sergestus  
Дата: 26.10.11 07:09
Оценка: :)
В следуюшем примере код компилируется нормально, но объект класса b не создается (пробовал на Visual studio 10 и на Borland builder 5), что бы это могло значить?

struct a
{
public:
a(){}
};


class b
{
public:
b(){}
b(a a_)
{
printf("!!!");
}
};


int main(int argc, char* argv[])
{
b b_(a()); // compiles, but doesn't create a code for this string ???

return 0;
}
Re: Странное поведение транслятора
От: okman Беларусь https://searchinform.ru/
Дата: 26.10.11 07:21
Оценка: +1
Здравствуйте, sergestus, Вы писали:

S>В следуюшем примере код компилируется нормально, но объект класса b не создается (пробовал на Visual studio 10 и на Borland builder 5), что бы это могло значить?


S>b b_(a()); // compiles, but doesn't create a code for this string ???

Это похоже на объявление функции.
Вот так будет работать:
a A;
b b_(A); // prints "!!!".
Re: Странное поведение транслятора
От: okman Беларусь https://searchinform.ru/
Дата: 26.10.11 07:32
Оценка: +2
P.S.
Компилятор видит строку "b b_(a());" как объявление функции b_, которая возвращает b, а в качестве
аргумента принимает указатель на функцию с cигнатурой "a()".
Re[2]: Странное поведение транслятора
От: sergestus  
Дата: 27.10.11 13:35
Оценка:
Здравствуйте, okman, Вы писали:

O>P.S.

O>Компилятор видит строку "b b_(a());" как объявление функции b_, которая возвращает b, а в качестве
O>аргумента принимает указатель на функцию с cигнатурой "a()".

Спасибо за разъяснение, компилятор действительно воспринимает строку как прототип функции, вот только почему он интерпретирует a() как а (*)()?
Re[3]: Странное поведение транслятора
От: sergestus  
Дата: 28.10.11 07:18
Оценка:
Мне тут подсказали, что компилятор интерпретирует а() как описание функции без имени (потому, что в прототипе функции параметры могут стоять без имени). Хотя и это еще не все, кроме этого копилятор дополнительно преобразует функцию в указатель на функцию... в итоге и получается а (*)().
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.