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