Причина в том, что в отсутствие этого правила ваши программы стали бы менее строгими. Быть более строгим - даже если это не применяется во время компиляции - хорошо, потому что, в свою очередь, вы получаете больше предсказуемости того, как программа будет вести себя. Это особенно важно, когда исходный код классов не находится под вашим контролем.
Множество понятий: RAII, умные указатели и просто общее выделение / освобождение памяти полагаются на на это правило. Количество раз, которое деструктор будет вызывать (один), составляет существенный для них. Поэтому документация для таких вещей обычно обещает: « Используйте наши классы в соответствии с правилами языка C ++, и они будут работать правильно! »
Если бы такого правила не было, оно указывало бы как " Используйте наши классы в соответствии с правилами языка C ++, и да, не вызывайте его деструктор дважды, тогда они будут работать правильно. " Многие спецификации звучат именно так.
Эта концепция слишком важна для языка, чтобы пропустить ее в стандартном документе.
Это причина. Ничего, связанного с бинарными внутренними объектами (которые описаны в ответе Potatoswatter ).