1

(10 відповідей, залишених у C++)

wander, окреме дякую за такий детальний розпис

2

(10 відповідей, залишених у C++)

wander написав:

Якщо коротко, то щоб уникнути UB. Тобто, щоб динамічний тип не залучати, бо це призведе до UB через відсутність віртуального деструктора. Хоча.. Я б таки глянув, що там буде реалізація робити. Адже, як ви знаєте, реалізація може генерувати декілька деструкторів, в залежності від організації вашого класу.

Я напевно спитаюсь дурницю, але про які деструктори йде мова? Це ви про типу default деструктори?

3

(10 відповідей, залишених у C++)

Вітаю.
Недавно побачив цікавий момент про приведення типів, сенс там був приблизно таким

struct Base {
    virtual void foo() = 0;
    ~Base();
};

struct Derived : Base {
    void foo() override;
    ~Derived();
};

int main() {
    Base* b = new Derived;
    // ...
    delete static_cast<Derived*>(b); // ось тут
}

І ніяк не можу зрозуміти для чого так робити?

4

(4 відповідей, залишених у C++)

Зрозуміло, дякую. Але ж може бути і сотня catch-ів, що йдуть один за одним?
І для чого ось це потрібно std::size_t size = 2; // блокуємо оптимізацію на основі відомого значення?

5

(4 відповідей, залишених у C++)

Вітаю.
Виникло кілька питань, щодо використання вийняткових ситуацій в С++. А саме написання коду без використання throw та try/catch блоків. Як часто таке практикується в сучасному С++ у реальних проектах? Дуже часто пишуть, що exceptions не є дешевими і якщо важлива продуктивність, то краще використовувати if/else і передавати помилку через них. Чи дійсно це так і краще писати код не опираючись на exceptions?
А, як ви відноситесь до використання exceptions в С++?

6

(13 відповідей, залишених у C++)

wander написав:
koala написав:

wander, а до чого це тут? Тут же все на операторах і без постінкременту, преінкремент виконається до додавання, правий операнд присвоєння обчислиться до лівого.

Для оператора присвоювання така гарантія є лише з С++17.

Прихований текст

Перепрошую за підняття теми, але хіба ще не з С++11

і = ++і; // OK ?

wander, хіба тут не те саме?

7

(5 відповідей, залишених у C++)

wander написав:
mimik написав:

Хіба він не мав сваритися, що клас Implementation не реалізований?

Мав, але є така штука, як: "ill-formed, no diagnostic required". І на те, чому так було зроблено є причини.

mamkin haker написав:

Звісно зберется, main ж пустий
оголосіть в main клас Test test; і побачите що не зберется :D

Питання було не в цьому *FACEPALM*

А, що за причини? Можна детальніше або де про це можна почитати?

8

(5 відповідей, залишених у C++)

Вітаю, пробую гратись з ідіомою pimpl, написав для початку такий код:

// Test.hpp
#include <memory>
class Implementation;

class Test {
public:
    Test()          = default;
    virtual ~Test() = default;
private:
    std::unique_ptr<Implementation> m_pImpl;
};
// main.cpp
#include "Test.hpp"
int main() {

    return 0;
}

І вирішив попробувати його збілдити, очікуючи, що він впаде. Але компілятор чомусь зібрав такий код, але чому? Хіба він не мав сваритися, що клас Implementation не реалізований?

9

(14 відповідей, залишених у C++)

Тобто, якщо ми введемо поняття:
- "оголошення об'єкта" для object declaration;
- "визначення об'єкта" для declaration of an object та object definition.
То, "у" - оголошує об'єкт, але не визначає його. Чи вірно я все зрозумів?

10

(14 відповідей, залишених у C++)

Ні, я мав на увазі

class A {
public:
    int &x;
    int  y; // це оголошення об'єкта чи ні?
};

Тому я написав "чи являється A::y об'єктом"? А не "чи являється а.y об'єктом"?

11

(14 відповідей, залишених у C++)

А чому так?
Тобто A::y це змінна, але не об'єкт?

“object” usually means “an instance of a class.” Thus a class defines the behavior of possibly many objects (instances).

Але об'єкт це не лише “an instance of a class.” хіба ні?

12

(14 відповідей, залишених у C++)

Вітаю, припустимо є такий код

class A {
public:
    int &x;
    int  y;
};

чи являється A::y об'єктом?

13

(18 відповідей, залишених у C++)

wander написав:

Завершитись lifetime об'єкта може кількома способами:
1. почався виклик деструктора;
2. storage, яке займає об'єкт, звільнилося або було перевикористане.

Прихований текст
N4659:Object lifetime 6.8\1 написав:

The lifetime of an object o of type T ends when:
— if T is a class type with a non-trivial destructor, the destructor call starts, or
— the storage which the object occupies is released, or is reused by an object that is not nested within o.

Я навмисне цитую С++17, бо в С++20 дещо змінилося (хоча це і не відноситься до даного питання), я думаю ще немає сенсу сильно вдарятися в С++20, бо їх ще досі повноцінно не завезли.

Цікаво, не знав про це. В книжках другий пункт якось опускають. А загалом наведений код, якщо розглядати його з практичної точки зору, має право на життя? Я про перевикористання об'єкту через цей new (&).

14

(18 відповідей, залишених у C++)

А хіба оцей new (&obj) ... {} це те саме, що повноцінний new/delete?

15

(18 відповідей, залишених у C++)

А чому друга dynamic?

16

(18 відповідей, залишених у C++)

Вітаю, недавно був на співбесіді і мені задали питання щодо storage duration в С++ виявилось, що я недостатньо в них розбираюсь. Ось схожий приклад коду:

class Cool {
public:
    Cool(std::string name) {}
    ~Cool() {}
};

int main() {
    Cool guy("first");

    new (&guy) Cool("second");

    Cool* girl = new Cool("third");
}

Питання було: який storage duration має first, second, third? Я відповів static, static, dynamic. Зараз я розумію, що я поплутав static з automatic, а те що називають static я чомусь думав, що це global. Про це мені пояснили, але я так і не зрозумів, так а яка мала б бути правильна відповідь?

17

(17 відповідей, залишених у C++)

Всім дякую за відповіді, здається, все більш-менш виглядає зрозумілим та закономірним.
Також, було цікаво почитати про те, як поводяться функції та вказівники на них.
А така ж поведінка з ***foo є і в С++?
І ще хотів запитатися, звідки вся ця інформація про те, що коли масив не перетворюється у вказівник. Наприклад, той же &, тобто я розумію тепер, чому & працює саме так, а не інакше. Але звідки про це можна дізнатися? В книжках такого нема (принаймні в тих, що є в мене).

18

(17 відповідей, залишених у C++)

Стоп, а чому & не виконує перетворення масиву у вказівник? Якщо я не помиляюся то &arr == &arr[0]?

tchort написав:

якби ви більш конкретно вказали жанр

author did.

Під cRPG можна підігнати майже любу гру

no.

Взагалі дивно, ви згадали про такий гігантський жанр cRPG, але не бачу або ви не сказали, чи грали у

and? so what? I don't like them.

Темні Душі, Фейбл...які є одними з найяскравіших представників свого жанру.

Цей жарт я навіть і не коментуватиму.
-пане mimik в чому сенс вашого повідомлення?, - це рекомендація?, чи це ви зазначили з того в що самі граєте? - ви хочете поділитися розсудженням про визначення crpg чи то вказати що вони є різні?
По перше автору скоріше за все про це відомо. Він теж має бороду. https://crpgbook.wordpress.com/
по друге - вказані в переліку ігри які я попіклувався надрукувати мають вказати на загальний мотив і напрям того що мені було-б цікаво. (Для всякого хто буде досить добрим аби чогось порекомендувати.)

fallout 4

Цей жарт пана Betterthanyou прокоментую лише так: торкатимусь того пластикового сміття лише багнетом гвинтівки вимазаного в кров хворого на гепатити тільки щоб зіштовхнути в прірву.

Порекомендувати.
Схоже ви жарти бачите там де їх немає.
Забавно, але нижче пан КІТ теж порекомендував Темні Душі, проте чомусь його повідомлення за жарт не ви не сприйняли, біполярочка?

Думаю, якби ви більш конкретно вказали жанр, то можна було б трохи більш детально говорити. Під cRPG можна підігнати майже любу гру. Взагалі дивно, ви згадали про такий гігантський жанр cRPG, але не бачу або ви не сказали, чи грали у Baldur's Gate, Divinity, Divinity: Original Sin, Старі Сувої, Відьмак, Темні Душі, Фейбл, Mount & Blade - які є одними з найяскравіших представників свого жанру.