В следующей строке кода:
bootrec_reset(File(path, size, off), blksize);
Вызов функции с прототипом:
static void bootrec_reset(File &file, ssize_t blksize);
Я получаю эту ошибку:
libcpfs / mkfs.cc: 99: 53: ошибка: недопустимая инициализация неконстантной ссылки типа 'File &' из rvalue типа 'File'
libcpfs / mkfs.cc: 30: 13: ошибка: при передаче аргумента 1 'void bootrec_reset (File &, ssize_t)'
Я знаю, что вы не можете передавать неконстантные ссылки ( const &
) к значениям r согласно стандарту. Однако MSVC позволяет это делать (см. этот вопрос ). Этот вопрос пытается объяснить, почему, но ответ не имеет смысла, поскольку он использует ссылки на литералы, которые являются крайним случаем и, очевидно, должны быть запрещены.
В данном примере ясно видно, что следующее порядок событий будет происходить (как в MSVC): будет вызван конструктор
файла
. файл
и blksize
, помещаются в стек. bootrec_reset
использует файл
. bootrec_reset
временный файл
уничтожается . Необходимо отметить, что ссылка Файл
не должна быть константной, поскольку это временный дескриптор файла, для которого вызываются неконстантные методы. Кроме того, я не хочу передавать аргументы конструктора File
в bootrec_reset
для создания там, а также не вижу причин для создания и уничтожения вручную File
в вызывающей программе.
Итак, мои вопросы: