HLFX.Ru Forum Страницы (9): [1] 2 3 4 5 » ... Последняя »
Показать все 123 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Технические вопросы (https://hlfx.ru/forum/forumdisplay.php?forumid=20)
-- нубовопросы по c++ (https://hlfx.ru/forum/showthread.php?threadid=5083)


Отправлено thambs 20-12-2017 в 19:37:

нубовопросы по 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


Отправлено XaeroX 21-12-2017 в 04:13:

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

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

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

__________________

xaerox on Vivino


Отправлено thambs 21-12-2017 в 08:31:

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

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


Отправлено ComradeAndrew 21-12-2017 в 18:56:

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

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


Отправлено Дядя Миша 21-12-2017 в 19:42:

А в новых стандартах 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'


Отправлено nemyax 21-12-2017 в 19:49:

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

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


Отправлено Дядя Миша 21-12-2017 в 19:52:

Цитата:
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'


Отправлено thambs 21-12-2017 в 21:23:

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

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


Отправлено nemyax 21-12-2017 в 21:32:

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


Отправлено XaeroX 22-12-2017 в 04:58:

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

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 on Vivino


Отправлено Дядя Миша 22-12-2017 в 14:32:

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

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

__________________
My Projects: download page

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

Цитата:

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


Отправлено XaeroX 22-12-2017 в 17:27:

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

__________________

xaerox on Vivino


Отправлено Дядя Миша 22-12-2017 в 17:49:

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

__________________
My Projects: download page

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

Цитата:

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


Отправлено XaeroX 22-12-2017 в 18:31:

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

__________________

xaerox on Vivino


Отправлено Дядя Миша 22-12-2017 в 19:15:

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

__________________
My Projects: download page

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

Цитата:

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


Временная зона GMT. Текущее время 12:29. Страницы (9): [1] 2 3 4 5 » ... Последняя »
Показать все 123 сообщений этой темы на одной странице

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