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:
9 | cout<<typeid(x).name()<<endl; |
10 | cout<<typeid(y).name()<<endl; |
11 | cout<<typeid(z).name()<<endl; |
На выходе имеем
Цитата:
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) |
Пустые круглые скобки нельзя использовать для вызова конструктора по умолчанию при создании объекта. Тут возникает двусмысленность - и компилятор строго по стандарту её разрешает. Если процитировать стандарт своими словами - то примерно так: "всё, что может быть объявлением функции, должно быть объявлением функции".__________________
Отправлено 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:
10 | Bar foo(); // <---- это не создание объекта класса Bar, но эта строка нужна! |
21 | int main(int argc, char *argv[]) |
Добавлено 22-12-2017 в 11:58:
Цитата:
Дядя Миша писал:
уже можно песать или до сих пор нельзя?
Да хоть так:
C++ Source Code:
std::vector<std::vector<std::vector<std::pair<int,int>>>> v; |
__________________
Отправлено Дядя Миша 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, она давно исправлена, да.
__________________
Отправлено Дядя Миша 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:
Дядя Миша
Шестая студия - это легенда, о которой рассказывают седые старики. Ну примерно как о том, как видели живого нациста.
__________________
Отправлено Дядя Миша 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'