Войти
ФлеймФорумПрограммирование

Общие вопросы по программированию (454 стр)

Страницы: 1453 454 455 456507 Следующая »
#6795
(Правка: 8:13) 8:06, 14 авг 2022

samrrr
> Го найди в С++ не запрещённое, но приводящее к уб.
  Несколько постов выше приведена часть описания memcpy. Советую ознакомиться. И вообще непонятно к чему вопрос. В С++ любое UB это следствие выполнения незапрещённых действий.

Panzerschrek[CN]
> Именно. Описание есть.
  Тогда и "ну чёто делает" это тоже описание :)

#6796
8:40, 14 авг 2022

Unspecified behavior gives the implementor some latitude in translating programs. This latitude does not extend as far as failing to translate the program.

#6797
15:49, 23 авг 2022

Забавную задачку увидел у какого-то контакта в Linkedin:
Изображение
Предлагается ответить на следующий вопрос - что будет напечатано в консоль (желательно на каждом шаге пояснить почему) и скомпилируется ли такой код вообще?

#6798
16:07, 23 авг 2022

totoro
a%
b%
b%%
a%%
Сначала мы вызываем конструктор базового класса
A()
a%
Потом дочернего
b%
Так как неявный this, то вызывается ссылочный метод для a и b
b%%
B() же в данном случае временный объект, поэтому он скорее всего rvalue
a%%
forward приводит аргумент к rvalue ссылки, то-есть к &&

#6799
(Правка: 16:10) 16:09, 23 авг 2022

О ! Нога попала в колесо OOP !
Теперь С++ гадают что же случиться :)

#6800
16:26, 23 авг 2022

Так порядок же действий просто...ну меня смущает int i

#6801
16:31, 23 авг 2022

FlyOfFly
> Так порядок же действий просто...ну меня смущает int i

+ Показать
#6802
20:02, 23 авг 2022

Объясните, что делает std::forward? Почему после него вызывается f как для класса A, игнорируя vtbl?

Ведь даже если создать объект класса B, потом взять на него ссылку как на объект класса A - все равно для этой A-ссылки f вызовется через vtbl

B b();
A& b_as_a = b;
b_as_a.f(); //  "B& "

или даже так

B b();
static_cast<A&&>(std::move(b)).f(); // "B&& ", несмотря на то, что вызов происходит для A&&

Что такого делает std::forward<A&&>, что вызывается f из класса A? Он создает новый объект, содержащий указатель на vtbl класса A? или как-то по-другому убеждает компилятор? Если второе - то как именно?

#6803
20:06, 23 авг 2022

Dmitry_Milk
Всдеструкторе виртуальный вызов не работает

#6804
20:12, 23 авг 2022

А с каких пор & и && могут быть декораторами функций? Впервые вижу такое, хотя смысл понятен.

#6805
(Правка: 20:52) 20:51, 23 авг 2022

1 frag / 2 deaths
> Всдеструкторе виртуальный вызов не работает

С какого это перепугу? Ты хочешь сказать, что вызов f() в деструкторе вызвал бы метод f из класса A даже в отсутствие std::forward<A&&>?

#6806
(Правка: 21:48) 21:18, 23 авг 2022

Dmitry_Milk
> Почему после него вызывается f как для класса A, игнорируя vtbl?
В деструкторе A, витейбл объекта - это A.

Dmitry_Milk
> С какого это перепугу? Ты хочешь сказать, что вызов f() в деструкторе вызвал бы
> метод f из класса A даже в отсутствие std::forward<A&&>?
Да.

Наглядный пример: https://godbolt.org/z/M6no7nn5q

1 frag / 2 deaths
> Всдеструкторе виртуальный вызов не работает
Не совсем так, виртуальные вызовы всё ещё работают - ты можешь передавать this по указателю как обычно, но они будут вызывать методы того класса, в деструкторе которого мы сейчас и находимся.

vtbl-указатель в объекте - это переменная. Каждый конструктор, перед выполнением своего тела, записывает в эту переменную таблицу своего класса. Каждый деструктор, по окончанию выполнения своего тела, записывает туда таблицу базового класса.

#6807
21:41, 23 авг 2022

Dmitry_Milk
> С какого это перепугу?
с такого что конструктуры вызываются от базового к наследуемым, а деструкторы в обратном порядке. При конструкторах виртуальный метод не вызвать потому что наследуемый еще не создан, а в деструкторах не имеет смысла потому что наследуемый уже подчищен.

#6808
21:52, 23 авг 2022

Имбирная Ведьмочка
> Да.

Охренеть, я четверть века жил в неведении :) Ладно хоть не писал на С++

#6809
21:54, 23 авг 2022

Aroch
> При конструкторах виртуальный метод не вызвать потому что наследуемый еще не
> создан, а в деструкторах не имеет смысла потому что наследуемый уже подчищен

Хм, да, логично. Странно, что я никогда с этим не сталкивался...

Страницы: 1453 454 455 456507 Следующая »
ФлеймФорумПрограммирование