Reddit - cpp - Якщо у моїх структурах класів є конструктори за замовчуванням

Можливо. Наступного разу, коли зіткнусь із ситуацією, я з тобою подумаю і зв’яжусь з тобою.

структурах

Це щось на кшталт того, що C ++ не дозволяє декларувати та ініціалізувати об'єкти окремо (а також, можливо, поганий дизайн). Є й інші мови, де це не так.

Я не думаю, що має сенс для варіанту чи кортежу (і, за розширенням, пари) мати конструктори за замовчуванням.

Хіба неініціалізований об’єкт - це просто деяка кількість байтів у пам’яті, значення яких не означають нічого корисного в контексті будь-якого типу, яким повинен бути об’єкт?

У мовах, якими я користувався, що дозволяє окреме оголошення/ініціалізацію, ваш код не компілюється, якщо компілятор не зможе довести, що ви ніколи не отримуєте доступ до неініціалізованого об’єкта.

EDIT: Крім того, C ++ не дозволяє вам мати нетривіальні неініціалізовані об'єкти. Просто оголошення об’єкта викликає його конструктор за замовчуванням.

EDIT 2: нетривіальні неініціалізовані об’єкти

Крім того, C ++ не дозволяє мати неініціалізовані об'єкти

Це очевидно неправильно. Простий локально оголошений int i; є зустрічним прикладом. І звичайно ж те саме стосується і нестандартних тривіальних типів.

Я не впевнений, що розглядав би змінні примітивних типів об'єктів. Однак ти маєш рацію, коли йдеться про тривіальні типи.

З цим зрозумілий стандарт С ++: екземпляри примітивних типів є об’єктами (§6.6.2/1). Спрощено, майже все з адресою пам'яті та типом є об’єктом у C ++. Помітним винятком є ​​функції, які не є об'єктами, навіть якщо вони займають пам'ять.

Не можу посперечатися зі стандартним ¯ \ _ (ツ) _/¯.

RAII не робить цього простим в обробці.

Це щось на кшталт того, що C ++ не дозволяє оголошувати та ініціалізувати об'єкти окремо

Ми говорили те саме.

Ви маєте рацію - я не помітив цього при першому прочитанні.

Спасибі. Мені подобається поняття "порожній стан".

Як правило, чим більше стан об’єкта, тим важче його міркувати. Якщо ви можете уникнути порожнього стану, я пропоную вам це зробити. Швидше за все, у вас є свого роду проблема XY, і є інший спосіб її вирішення, крім порожнього стану. Натомість прагніть до того, щоб ваші об’єкти завжди були самоузгоджені. Визначте об’єкт за його інваріантами та переконайтесь, що жоден загальнодоступний інтерфейс об’єкта не допускає порушення цих інваріантів.