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

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


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

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

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

C++ Source Code:
struct foo{
foo(){}
foo(int...){}
};
int main () {
    foo x;
    foo y();
    foo z(1);
    cout<<typeid(x).name()<<endl;
    cout<<typeid(y).name()<<endl;
    cout<<typeid(z).name()<<endl;
    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 в 03:13:

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

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

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

__________________
So she began again: 'Où est ma chatte?' which was the first sentence in her French lesson-book. The Mouse gave a sudden leap out of the water, and seemed to quiver all over with fright. 'Oh, I beg your pardon!' cried Alice hastily, afraid that she had hurt the poor animal's feelings. 'I quite forgot you didn't like cats.'


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

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

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


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

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


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


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

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

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


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

__________________
В действительности всё может оказаться иначе, чем оно есть на самом деле

My Projects: download page


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

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

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


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

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

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

__________________
В действительности всё может оказаться иначе, чем оно есть на самом деле

My Projects: download page


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

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

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


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

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


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

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

C++ Source Code:
class Bar
{
public:
    Bar() = default;
    void Foo();
};

void Bar::Foo()
{
    Bar foo(); // <---- это не создание объекта класса Bar, но эта строка нужна!
    foo();
    std::cout << "Bar";
}

Bar foo()
{
    std::cout << "Foo";
    return Bar();
}

int main(int argc, char *argv[])
{
    Bar bar;
    bar.Foo();
}


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

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

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

__________________
So she began again: 'Où est ma chatte?' which was the first sentence in her French lesson-book. The Mouse gave a sudden leap out of the water, and seemed to quiver all over with fright. 'Oh, I beg your pardon!' cried Alice hastily, afraid that she had hurt the poor animal's feelings. 'I quite forgot you didn't like cats.'


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

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

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

__________________
В действительности всё может оказаться иначе, чем оно есть на самом деле

My Projects: download page


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

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

__________________
So she began again: 'Où est ma chatte?' which was the first sentence in her French lesson-book. The Mouse gave a sudden leap out of the water, and seemed to quiver all over with fright. 'Oh, I beg your pardon!' cried Alice hastily, afraid that she had hurt the poor animal's feelings. 'I quite forgot you didn't like cats.'


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

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

__________________
В действительности всё может оказаться иначе, чем оно есть на самом деле

My Projects: download page


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

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

__________________
So she began again: 'Où est ma chatte?' which was the first sentence in her French lesson-book. The Mouse gave a sudden leap out of the water, and seemed to quiver all over with fright. 'Oh, I beg your pardon!' cried Alice hastily, afraid that she had hurt the poor animal's feelings. 'I quite forgot you didn't like cats.'


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

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

__________________
В действительности всё может оказаться иначе, чем оно есть на самом деле

My Projects: download page


Временная зона GMT. Текущее время 22:08. Страницы (3): [1] 2 3 »
Показать все 33 сообщений этой темы на одной странице

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