Передача неконстантных ссылок на rvalue в C ++

В следующей строке кода:

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): будет вызван конструктор

  1. файла .
  2. Ссылка на файл и blksize , помещаются в стек.
  3. bootrec_reset использует файл .
  4. После возврата из bootrec_reset временный файл уничтожается .

Необходимо отметить, что ссылка Файл не должна быть константной, поскольку это временный дескриптор файла, для которого вызываются неконстантные методы. Кроме того, я не хочу передавать аргументы конструктора File в bootrec_reset для создания там, а также не вижу причин для создания и уничтожения вручную File в вызывающей программе.

Итак, мои вопросы:

  1. Что оправдывает стандарт C ++, запрещающий подобным образом неконстантные ссылки?
  2. Как я могу заставить GCC разрешить этот код?
  3. грядущий стандарт C ++ 0x изменит это в любом случае, или есть что-то, что новый стандарт дает мне более подходящее здесь, например, весь этот треп о ссылках на rvalue?

13
задан Community 23 May 2017 в 12:16
поделиться