В следующей строке кода:
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 &
) на rvalues в соответствии со стандартом. Однако MSVC позволяет это сделать (см. этот вопрос). Этот вопрос пытается объяснить, почему, но ответ не имеет смысла, поскольку он использует ссылки на литералы, которые являются краеугольным камнем и, очевидно, должны быть запрещены.
В данном примере ясно видно, что произойдет следующий порядок событий (как в MSVC):
- Вызов конструктора
-
File
. - Ссылка на
File
иblksize
помещается в стек. -
bootrec_reset
используетFile
. - После возврата из
bootrec_reset
временныйFile
будет уничтожен.
Необходимо указать, что ссылка File
должна быть неконстантной, так как она является временным дескриптором файла, на который вызывается неконтентные методы. Кроме того, я не хочу передавать аргументы конструктора File
в bootrec_reset
, которые должны быть построены там, и я не вижу причин вручную создавать и уничтожать объект File
в вызывающем.
Итак, мои вопросы:
- Что оправдывает стандарт С++, запрещающий неконстантные ссылки таким образом?
- Как я могу заставить GCC разрешить этот код?
- Неужели следующий стандарт С++ 0x изменит это в любом случае, или есть ли что-то, что новый стандарт дает мне, что более уместно здесь, например, все, что смешно о ссылках на rvalue?