Причина в том, что копия исключена.
В этом случае:
Check b[2] = {Check(5),Check(4)};
Поскольку оба значения являются временными, компилятору разрешено (или, в C ++ 17, принудительно) оптимизировать удаление копии и вместо этого создать объекты на месте.
Однако, во втором случае:
Check a[2] = {obj1,obj2};
obj1
и obj2
не являются временными, поэтому в этом случае должны иметь место реальные копии.
Каждый раз, когда я сделал это, это должно было избежать медленных линейных поисков в файловых системах. К счастью, по крайней мере, на Linux, это становится вещью прошлого.
Однако даже сегодня, с основанными на B-дереве каталогами, с очень большим каталогом будет трудно иметь дело, так как он возьмет навсегда и день только для получения списка всех файлов, не берите в голову нахождение правильного файла.
Просто используйте даты. Так как Вы удалите по дате.:)