将临时对象作为引用差异传递
在 C 中,临时对象只能传递给声明为 const、按值或声明为 const 的引用右值引用。此限制可防止无意中修改临时变量,这通常会导致运行时错误。
编译器错误
考虑以下代码:
class Foo { public: Foo(int x) {}; }; void ProcessFoo(Foo& foo) { } int main() { ProcessFoo(Foo(42)); return 0; }
在 Linux 上和Mac,此代码无法通过以下方式编译错误:
error: invalid initialization of non-const reference of type ‘Foo&’ from an rvalue of type ‘Foo’
此错误源于尝试将临时 Foo 对象传递给非常量引用参数,而 C 禁止这样做。
解决方法
要解决此问题,可以采用以下方法解决方法:
Foo foo42(42); ProcessFoo(foo42);
这里创建了一个临时 foo42 变量并通过引用传递。
void ProcessFoo(const Foo& foo)
这允许由于 const 限定符而传递临时对象。
void ProcessFoo(Foo foo)
按值传递会将临时值复制到函数中,规避错误。
Visual Studio 与 g
在这种情况下,Visual Studio 的行为与 g 不同。 MSVC 允许将临时值传递给非常量引用,这可能会引入微妙的运行时问题。这种行为与 g 形成鲜明对比,g 严格遵守 C 标准,禁止此类做法。
以上是为什么我不能将临时对象传递给 C 中的非常量引用?的详细内容。更多信息请关注PHP中文网其他相关文章!