41

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

Ага. Ну, все одно sizeof читає ім'я змінної і навіть в момент компіляції потрібно знати інформацію про об'єкт, значить вона ж десь записана ця інформація, чи ви хочете сказати що в момент компіляції відбувається пошук слова int?

42

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

Ну, як я зрозумів sizeof працює лише в момент компіляції, а якщо я допустимо хочу дізнатися розмір під час виконання?
Не зовсім зрозуміло, як він реалізований всередині? Тобто є якісь дескрайбери для об'єктів?
Я не збираюся замінювати вбудований sizeof, а просто мати свою версію в додаток, не більше.

43

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

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

44

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

Дякую. Цей момент мені більш-менш зрозумілий, єдине я все ще не розумію, для чого потрібні xvalue?

45

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

koala написав:

До C++11 було все просто: є lvalues і rvalues, які відрізняються тим, з якого боку оператора присвоювання вони можуть стояти. lvalue може неявно перетворюватися на rvalue, але не навпаки.
В C++11 запровадили семантику переміщення: особливий стан об'єкта, коли його ресурси можна перебирати, бо більше ним не будуть користуватися. Це і є xvalue. За новим визначенням, ліворуч від = може бути glvalue = lvalue+xvalue, праворуч rvalue = prvalue+xvalue.

Так, це я загалом зрозумів, як воно виникло.

koala написав:

Reference - це, по суті, і є адреса. Так, це тимчасовий об'єкт - але він тимчасовий у зовнішньому просторі імен. Поки живе rvalue reference, житиме і його адреса. Зате можна виходити з того, що після того, як ми його "відпустимо", він помре, і грабувати його ресурси.

То у тимчасового об'єкта, можна взяти його адресу?

wander написав:

Ні. Ваша змінна cat — lvalue, а її тип rvalue-reference. Тобто грубо кажучи це rvalue, а не prvalue, де останній є реально тимчасовим об'єктом. В даному контексті їх легко розрізнити rvalue — об'єкт з іменем, а prvalue — без. Хоча, якщо говорити більш правильно, то об'єкт таки тимчасовий Cat(), проте в результаті перед тим як померти його врятували та продовжили йому життя шляхом присвоєння до rvalue-reference. Бо формально тимчасовий об'єкт чи ні визначається способом, яким він створювався. Прибиття посилання до тимчасового об'єкта не робить його не тимчасовим.

То вона rvalue чи lvalue?

46

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

ExPy написав:

Учитуючи, що 3 роки Трампа (з 4ьох) були пiд погрозою iмпiчмента, а тепер щей тi негри вилiзли.. Демократи сильно сунуть йому палки в колеса. Що там буде восени - побачим. Але США (та i Еуропа) дограються колись з толерантнiстю, якшо вже не догрались..

На мою думку там проблема не лише в збоченому расизмі та надмірною толерантністю, але і взагалі в неправильній політиці всього західного світу. Де людям, які потребують допомоги дають рибу, замість вудки, а рибу ту дають держави руками (податками) людей, які чесно працюють і годують цих дикунів. В результаті, звісно, навіщо їм працювати? Якщо держава нахаляву дає 1000$ і не контролює популяцію цих мавп, ба більше, навіть навпаки приймає ще зверху всяких біженців (як деякі країни Європи). Насправді ці дикуни почали нищити та вбивати (вони ж більше нічого не вміють) ще раніше. Як результат зпалені такі пам'ятки архітектури, як: Notre Dame de Paris, Gare de Lyon та купи маніяків.

47

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

Вітаю! По ходу свого вивчення С++ зіткнувся з виразами, зокрема новими, які вроді появилися відносно не давно (rvalue, glvalue, prvalue, xvalue, lvalue). Lvalue начебто просто - все, від чого можна брати адрес. А ось різницю між xvalue і prvalue я до кінця так і не зрозумів, як визначити, що є що? Як наступний код з lvalue робить xvalue і чому це xvalue, а не prvalue?

#include <iostream>
using namespace std;

struct Cat 
{
    
};

int main() 
{
    Cat&& cat = Cat();
    cout << &(static_cast<Cat&&>(cat)); // Помилка
    cout << &cat; // Все ок
}

Що зробив static_cast? По суті він же привів тип T до типу T? Що він змінив?
Ще питання, навіщо потрібно поділ на rvalue і glvalue?
І чому від rvalue reference можна брати адрес? Це хіба не тимчасовий об'єкт?
Якщо щось наплутав, будь ласка, поправте.

48

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

І що це означає?

Привіт всім,
бачив на одному сайті присвяченому С++, що створювати об'єкти класу через malloc не можна.

struct X {
    int a, b;
};

int main() {
    X *p = (X*)malloc(sizeof(X));
    p->a = 1;
    p->b = 2;
    free(p);
}

І що код вище є не правильним в С++ і, що так можна писати лише в С, але не в С++. Але чому так не можна робити в С++?

50

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

Зрозуміло, дякую.

51

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

wander, дякую за літературу, напевно зупинюся на першому варіанті.
То, автор в книжці правий чи ні?
І що таке POD?

52

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

І от ще:

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

https://i.gyazo.com/e387190364edea9e645210b2281a0fb8.png

wander написав:

mimik, кидайте ту книгу, автор здається мухоморів об'ївся.

А, що можете порадити?

53

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

wander написав:

А вже value-initialization, якщо ви не визначили власний конструктор по замовчуванню, зробить для вас zero-initialization.

Зрозуміло.

wander написав:

Це в якій такій?

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

https://i.gyazo.com/611fb2d99278d386e1e77e9f1ac844d2.png
С++ без страха, Брайан Оверленд

koala написав:

Ясно?

Більш менш

54

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

koala, так, ось так працює:

Point pt1 = Point();

Але чому?
wander, про те, що мало би занулювати писало в книжці.

55

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

З цим зрозуміло. Проясніть тоді, будь ласка, такий момент, якщо я правильно розумію, то конструктор за замовчуванням, який додається компілятором, встановлює всі дані-члени в нуль, а всім вказівниками присвоюються нульові значення?

56

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

Вітаю,

ніяк не можу зрозуміти, чому замість нулів виводить якийсь мусор (Point pt1) -858993460, -858993460 ?
Я вже пробував різні варіанти, навіть без конструктора, але навіть в такому випадку виводить -858993460 замість 0, в чому помилка? Конструктор по замовчуванню мав би обнулити.

#include <iostream>
using namespace std;
 
class Point {
private:
       int x, y;
public:
       Point() {}
       int get_x() {return x;}
       int get_y() {return y;}
};
 
int main() {
    Point pt1;
    cout << pt1.get_x() << ", ";
    cout << pt1.get_y() << endl; 
    return 0;
}

57

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

Так, дякую, я вже здається майже все зрозумів про що йшлося, зокрема про те, що перетворення там немає. Просто в книжці я не бачив, щоб це пояснювалось.

58

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

Так там не було задачі, мені просто було цікаво чому так:

void f(base *barr) {}

Derived darr[100];
...
f(darr);

працює, а так ні:

void f(base **barr) {}

Derived *darr[100];
...
f(darr);

59

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

Так-с, на це потрібен час, щоб з цим жити далі. Я вірно розумію, що так краще не робити, але бувають вийнятки з правил, як завжди?

60

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

Я тепер нічого не розумію.