HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > нубовопросы по c++
Страницы (9): [1] 2 3 4 5 » ... Последняя »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
thambs
мразь конченная

Дата регистрации: Mar 2006
Проживает: -
Сообщений: 6417

Рейтинг



нубовопросы по c++

Неожиданно, возник вопрос про конструкторы по умолчанию. Например, есть структура

C++ Source Code:
1
struct foo{
2
  foo(){}
3
  foo(int...){}
4
};
5
int main () {
6
  foo x;
7
  foo y();
8
  foo z(1);
9
  cout<<typeid(x).name()<<endl;
10
  cout<<typeid(y).name()<<endl;
11
  cout<<typeid(z).name()<<endl;
12
  return 0;

На выходе имеем
Цитата:
3foo
F3foovE
3foo

или после с++filt
Цитата:
foo
foo ()
foo

Почему записи "foo x" и "foo x()" не эквивалентны и что за такой тип "foo ()"?

__________________
http://www.moddb.com/mods/monorail-quest

Сообщить модератору | | IP: Записан
Сообщение: 170093

Старое сообщение 20-12-2017 19:37
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Тип foo() - это функция, возвращающая foo и не принимающая никаких аргументов. Ты же сам её объявил, смотри:

C++ Source Code:
foo x;  // создание экземпляра класса foo с вызовом конструктора по умолчанию
foo y();  // объявление функции y, которая возвращает foo
foo z(1);  // создание экземпляра класса foo с вызовом конструктора foo(int)

Пустые круглые скобки нельзя использовать для вызова конструктора по умолчанию при создании объекта. Тут возникает двусмысленность - и компилятор строго по стандарту её разрешает. Если процитировать стандарт своими словами - то примерно так: "всё, что может быть объявлением функции, должно быть объявлением функции".

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 170097

Старое сообщение 21-12-2017 04:13
-
thambs
мразь конченная

Дата регистрации: Mar 2006
Проживает: -
Сообщений: 6417

Рейтинг



>это функция
действительно. что-то сразу не распарсил.

__________________
http://www.moddb.com/mods/monorail-quest

Сообщить модератору | | IP: Записан
Сообщение: 170104

Старое сообщение 21-12-2017 08:31
- За что?
ComradeAndrew
Житель форума

Дата регистрации: Aug 2014
Проживает: Дубай
Сообщений: 510
Возраст: 27

Рейтинг



C++ Source Code:
foo y();  // объявление функции y, которая возвращает foo

Вот ведь. Никогда об этом не задумывался. Только сейчас дошло. Спасибо

Сообщить модератору | | IP: Записан
Сообщение: 170121

Старое сообщение 21-12-2017 18:56
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



А в новых стандартах C++ вот так

C++ Source Code:
std::vector< std::pair< vec_t, int >> foo;

уже можно песать или до сих пор нельзя?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 170123

Старое сообщение 21-12-2017 19:42
-
nemyax
Нёмыч

Дата регистрации: Jul 2011
Проживает: (void)
Сообщений: 4133

Рейтинг



Дядя Миша
В смысле STL-контейнер в STL-контейнере? Я юзал и мысли не было, что так нельзя. Студия 2015 хавала.

C++ Source Code:
std::map<HCP*, std::set<HCP*>> slu;

Сообщить модератору | | IP: Записан
Сообщение: 170125

Старое сообщение 21-12-2017 19:49
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
nemyax писал:
В смысле STL-контейнер в STL-контейнере?

нет. Ну Ксер поймет

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 170127

Старое сообщение 21-12-2017 19:52
-
thambs
мразь конченная

Дата регистрации: Mar 2006
Проживает: -
Сообщений: 6417

Рейтинг



>foo y(); // объявление функции y, которая возвращает foo
А не, всё равно не распарсил, это же nested-функция получается а они в стандарте запрещены.

__________________
http://www.moddb.com/mods/monorail-quest

Сообщить модератору | | IP: Записан
Сообщение: 170130

Старое сообщение 21-12-2017 21:23
- За что?
nemyax
Нёмыч

Дата регистрации: Jul 2011
Проживает: (void)
Сообщений: 4133

Рейтинг



thambs
Объявить дадут, а определить нет.

Сообщить модератору | | IP: Записан
Сообщение: 170131

Старое сообщение 21-12-2017 21:32
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Да, объявлять функции внутри функций вполне можно.
Вот тебе конкретный пример, где это необходимо:

C++ Source Code:
1
class Bar
2
{
3
public:
4
  Bar() = default;
5
  void Foo();
6
};
7
 
8
void Bar::Foo()
9
{
10
  Bar foo(); // <---- это не создание объекта класса Bar, но эта строка нужна!
11
  foo();
12
  std::cout << "Bar";
13
}
14
 
15
Bar foo()
16
{
17
  std::cout << "Foo";
18
  return Bar();
19
}
20
 
21
int main(int argc, char *argv[])
22
{
23
  Bar bar;
24
  bar.Foo();
25
}


Добавлено 22-12-2017 в 11:58:

Цитата:
Дядя Миша писал:
уже можно песать или до сих пор нельзя?

Да хоть так:
C++ Source Code:
std::vector<std::vector<std::vector<std::pair<int,int>>>> v;

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Отредактировано XaeroX 22-12-2017 в 04:56

Сообщить модератору | | IP: Записан
Сообщение: 170136

Старое сообщение 22-12-2017 04:58
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
XaeroX писал:
Да хоть так:

И компилятор больше не посчитает это битовым сдвигом?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 170147

Старое сообщение 22-12-2017 14:32
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Дядя Миша
Ошибка была только в компиляторе MSVC, она давно исправлена, да.

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 170153

Старое сообщение 22-12-2017 17:27
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



XaeroX ну что же. Для шестой студии статьи Борескова всё еще актуальны

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 170155

Старое сообщение 22-12-2017 17:49
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Дядя Миша
Шестая студия - это легенда, о которой рассказывают седые старики. Ну примерно как о том, как видели живого нациста.

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 170158

Старое сообщение 22-12-2017 18:31
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



XaeroX как у МаркТвена было написано в каком-то из рассказов, юзая шестую студию, я внезапно начал ощущать дружеские чувства к мумии фараона и желание поболтать с ним на злободневные темы.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 170159

Старое сообщение 22-12-2017 19:15
-
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 21:51. Новая тема    Ответить
Страницы (9): [1] 2 3 4 5 » ... Последняя »   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > нубовопросы по c++
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024