Форум программистов, компьютерный форум CyberForum.ru

Странное поведение транслятора - C++

Восстановить пароль Регистрация
 
sergestus
73 / 73 / 23
Регистрация: 26.10.2011
Сообщений: 212
Завершенные тесты: 1
26.10.2011, 10:33     Странное поведение транслятора #1
В следуюшем примере код компилируется нормально, но объект класса b не содается (пробывал на Visual studio 10 и на Borland builder 5), что бы это могло значить?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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;
}
 Комментарий модератора 
Используйте теги форматирования кода
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2011, 10:33     Странное поведение транслятора
Посмотрите здесь:

C++ Странное поведение компилятора
C++ Странное поведение
Странное поведение wstring C++
Странное поведение new C++
Странное поведение cin C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HighPredator
 Аватар для HighPredator
5347 / 1730 / 320
Регистрация: 10.12.2010
Сообщений: 5,112
Записей в блоге: 3
26.10.2011, 12:11     Странное поведение транслятора #2
Если вы пытались откомпилировать сие в VS, то компилятор навреняка выдал вам warning c4930, говорящий о том, что он рассматривает конструкцию b b_(a()); как прототип функции, поскольку фактическим параметром выступает анонимный класс (не имеет имени). Соответственно, нет инстанцированного объекта в виде параметра.
Варианты борьбы:
1) создать промежуточную переменную
C++
1
2
a temp;
b b_(k);
2) согласно стандарту заключить в дополнительные скобки.
C++
1
b b_((a()));
sergestus
73 / 73 / 23
Регистрация: 26.10.2011
Сообщений: 212
Завершенные тесты: 1
27.10.2011, 16:37  [ТС]     Странное поведение транслятора #3
>>Если вы пытались откомпилировать сие в VS, то компилятор навреняка выдал вам warning c4930, говорящий о том, что он рассматривает конструкцию b b_(a()); как прототип функции, поскольку фактическим параметром выступает анонимный класс (не имеет имени). Соответственно, нет инстанцированного объекта в виде параметра.

Вы совершенно правы, предупрежднние выдается, просто я не обратил внимания. Данная конструкция появилась случайно и я просто решил разобраться в чем проблема. Компилятор действительно воспринимает строку как прототип функции, вот только почему он интерпретирует a() как а (*)()?
HighPredator
 Аватар для HighPredator
5347 / 1730 / 320
Регистрация: 10.12.2010
Сообщений: 5,112
Записей в блоге: 3
27.10.2011, 19:48     Странное поведение транслятора #4
Цитата Сообщение от sergestus Посмотреть сообщение
только почему он интерпретирует a() как а (*)()?
А что-ж это по-вашему?

Добавлено через 1 минуту
У вас же анонимный вызов.
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
27.10.2011, 19:56     Странное поведение транслятора #5
Извиняюсь за оффтоп. Тему перепутал
sergestus
73 / 73 / 23
Регистрация: 26.10.2011
Сообщений: 212
Завершенные тесты: 1
28.10.2011, 11:22  [ТС]     Странное поведение транслятора #6
Цитата Сообщение от Predator_2004 Посмотреть сообщение
А что-ж это по-вашему?

Добавлено через 1 минуту
У вас же анонимный вызов.
Мне тут подсказали, что компилятор интерпретирует а() как описание функции без имени (потому, что в прототипе функции параметры могут стоять без имени). Хотя и это еще не все, кроме этого копилятор дополнительно преобразует функцию в указатель на функцию... в итоге и получается а (*)().
Yandex
Объявления
28.10.2011, 11:22     Странное поведение транслятора
Ответ Создать тему
Опции темы

Текущее время: 05:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru