首页 > 后端开发 > C++ > 为什么我不能将临时对象传递给 C 中的非常量引用?

为什么我不能将临时对象传递给 C 中的非常量引用?

DDD
发布: 2024-12-10 22:29:10
原创
312 人浏览过

Why Can't I Pass a Temporary Object to a Non-Const Reference in C  ?

将临时对象作为引用差异传递

在 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 禁止这样做。

解决方法

要解决此问题,可以采用以下方法解决方法:

  1. 创建临时变量:
Foo foo42(42);
ProcessFoo(foo42);
登录后复制

这里创建了一个临时 foo42 变量并通过引用传递。

  1. 经过Const参考:
void ProcessFoo(const Foo& foo)
登录后复制

这允许由于 const 限定符而传递临时对象。

  1. 按值传递:
void ProcessFoo(Foo foo)
登录后复制

按值传递会将临时值复制到函数中,规避错误。

Visual Studio 与 g

在这种情况下,Visual Studio 的行为与 g 不同。 MSVC 允许将临时值传递给非常量引用,这可能会引入微妙的运行时问题。这种行为与 g 形成鲜明对比,g 严格遵守 C 标准,禁止此类做法。

以上是为什么我不能将临时对象传递给 C 中的非常量引用?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板