- "Что оправдывает стандарт C ++, запрещающий неконстантные ссылки таким образом?"
Практический опыт работы с противоположным соглашением, с помощью которого все работало изначально. C ++ является в значительной степени развитым языком, а не разработанным. По большому счету, все еще существуют правила, которые сработали (хотя некоторые БОЛЬШИЕ исключения из этого произошли со стандартизацией 1998 года, например печально известная export
, где комитет изобрел, а не стандартизировал существующую практику).
Для правила связывания у каждого был не только опыт работы с C ++, но и аналогичный опыт работы с другими языками, такими как Fortran.
Как отмечает @j_random_hacker в своем ответе (который, как я уже писал, этот показатель был равен 0, показывая, что оценка в SO действительно не работает как показатель качества), наиболее серьезные проблемы связаны с неявными преобразованиями и перегрузкой. разрешение.
- «Как я могу заставить GCC разрешить этот код?»
Вы не можете.
Вместо ...
bootrec_reset(File(path, size, off), blksize);
... написать ...
File f(path, size, off);
bootrec_reset(f, blksize);
Или определить соответствующую перегрузку bootrec_reset
. Или, если «умный» код апеллирует, вы в принципе можете написать bootrec_reset(tempref(File(path, size, off)), blksize);
, где вы просто определяете tempref
, чтобы возвращать ссылку на аргумент соответствующим образом константно. Но даже если это техническое решение, не надо.
- "Изменяет ли это предстоящий стандарт C ++ 0x в любом случае, или есть что-то, что дает мне новый стандарт, который более уместен здесь, например, весь этот бред относительно ссылок на rvalue?"
Нет, ничего, что меняет вещи для данного кода.
Однако, если вы хотите переписать, вы можете использовать, например, C ++ 0x rvalue ссылки или обходные пути C ++ 98, показанные выше.
Приветствия и hth.,