将临时对象作为引用传递
在 C 中,使用临时对象作为引用可能会导致意外行为。为了避免这种情况,编译器强制限制将临时对象传递给引用参数。
编译初始查询中提供的代码时:
class Foo { public: Foo(int x) {}; }; void ProcessFoo(Foo& foo) {}; int main() { ProcessFoo(Foo(42)); return 0; }
出现错误是因为临时 Foo(42 ) 对象被传递给非常量引用参数 (ProcessFoo(Foo& foo))。根据设计,C 不允许这种做法。
解决方法:
建议的解决方法通过以下方式缓解该问题:
创建临时变量:将临时对象赋值给变量然后传递它作为引用:
Foo foo42(42); ProcessFoo(foo42);
使用常量引用:修改 ProcessFoo 以获取常量引用(ProcessFoo(const Foo& foo)),这允许它接受临时的对象:
void ProcessFoo(const Foo& foo) {}; ProcessFoo(Foo(42));
按值传递:允许ProcessFoo按值接收对象(ProcessFoo(Foo foo)),从而避免引用限制:
void ProcessFoo(Foo foo) {}; ProcessFoo(Foo(42));
编译器差异:
Microsoft Visual Studio 和 GNU C (g ) 之间的行为差异可能是由于默认设置不同造成的。默认情况下,g 强制更严格地遵守 C 标准,而 Visual Studio 可能允许某些偏差。这可能会导致一个编译器生成错误,而另一个编译器不会生成错误。
以上是为什么我不能将临时 C 对象传递给非常量引用?的详细内容。更多信息请关注PHP中文网其他相关文章!