在以下代码行中:
bootrec_reset(File(path, size, off), blksize);
使用原型调用函数:
static void bootrec_reset(File &file, ssize_t blksize);
我收到此错误:
libcpfs/mkfs.cc:99:53:错误:从“File”类型的右值对“File&”类型的非常量引用无效初始化
libcpfs/mkfs.cc:30:13: 错误: 传递 'void bootrec_reset(File&, ssize_t)' 的参数 1
我知道您不能const &
根据标准将非常量引用 () 传递给右值。但是,MSVC 允许您执行此操作(请参阅此问题)。这个问题试图解释原因,但答案没有意义,因为他使用的是对文字的引用,这是一种极端情况,显然应该被禁止。
在给定的示例中,可以清楚地看到将发生以下事件顺序(就像在 MSVC 中一样):
File
的构造函数将被调用。File
对和的引用blksize
被压入堆栈。bootrec_reset
利用file
.- 从 中返回后
bootrec_reset
,临时File
对象被销毁。
有必要指出File
引用必须是非常量的,因为它是文件的临时句柄,在该文件上调用非常量方法。此外,我不想传递要在那里File
构造的构造函数参数bootrec_reset
,我也看不出有任何理由File
在调用者中手动构造和销毁对象。
所以我的问题是:
- 是什么证明 C++ 标准以这种方式不允许非常量引用?
- 如何强制 GCC 允许此代码?
- 即将到来的 C++0x 标准是否会改变这一点,还是新标准给我的东西在这里更合适,例如所有关于右值引用的胡言乱语?