Почему рекомендуется явно объявлять конструктор копирования, даже когда компилятор создает открытый конструктор копирования
Это не так.
Если у вас нет специальной логики для выполнения в конструкторе копирования, вам не нужно предоставлять ее, а это просто шум.
Если вы это сделаете, то, очевидно, вам придется написать этот код, предоставив свой собственный конструктор копирования.
В некоторых старых текстах может быть предложено объявить все специальные функции-члены, даже если их определения пусты, потому что, если вы хотите добавить содержательные определения позже, вы не изменяете заголовок, содержащий определение для учебный класс. Это помогает сократить время восстановления и проблемы совместимости с проектами, использующими ваш код.
Но если это когда-либо произойдет, это почти наверняка произойдет, потому что вы изменили или добавили некоторые элементы данных, поэтому вам все равно придется изменить заголовок. И, честно говоря, такое существенное изменение семантики класса в любом случае требует некоторого осторожного взгляда. Я не вижу преимущества в том, чтобы сделать код настолько подробным, насколько это возможно, просто ради внесения изменений, которые не должны быть полностью прозрачными, прозрачными.