Es perfectamente válido declarar un arreglo ordinario como variable miembro de un struct. El constructor por copia implícito (y también el operador de asignación implícito) incluso nos hacen el favor de copiar el arreglo, elemento por elemento.
struct ejemplo {
int arr[5];
};
int main( ) {
int a[5] = { 3, 1, 4, 1, 6 };
int b[5] = a; // ¡mal! el lenguaje simplemente no lo permite
ejemplo e = { { 3, 1, 4, 1, 6 } }; // las llaves externas son del struct, las internas son para el arreglo
std::cout << e.arr[0] << "\n"; // 3
ejemplo f = e; // ¡ok! se copia el arreglo interno elemento a elemento
std::cout << f.arr[0] << "\n"; // 3
}
El código anterior exhibe una contradicción en C y C++: se prohibe copiar directamente un arreglo, pero se permite hacerlo si el arreglo vive dentro de un struct.
Algo que no comenté pero que tal vez sea útil saberlo: declarar el constructor por copia inhibe el constructor por defecto (ya lo sabíamos), pero declarar el constructor por defecto no inhibe el constructor por copia, ni el operador de asignación.