首页 > 后端开发 > C++ > 为什么在 C 中将临时对象传递给非常量引用失败?

为什么在 C 中将临时对象传递给非常量引用失败?

Patricia Arquette
发布: 2024-12-05 09:07:11
原创
352 人浏览过

Why Does Passing a Temporary Object to a Non-Const Reference Fail in C  ?

在 C 中将临时对象作为引用传递

在 C 中,如下所示的最小代码片段可能会导致 Linux 和 Mac 上的编译错误平台:

class Foo
{
public:
    Foo(int x) {}
};

void ProcessFoo(Foo& foo)
{
}

int main()
{
    ProcessFoo(Foo(42));
    return 0;
}
登录后复制

编译错误:

编译上述代码会导致以下错误:

newfile.cpp: In function ‘int main()’:
newfile.cpp:23:23: error: invalid initialization of non-const reference of type ‘Foo&’ from an rvalue of type ‘Foo’
     ProcessFoo(Foo(42));
                       ^
newfile.cpp:14:6: note: in passing argument 1 of ‘void ProcessFoo(Foo&)’
 void ProcessFoo(Foo& foo)
登录后复制

发生错误的原因:

按设计, C 禁止将临时对象传递给非常量引用参数。此限制旨在防止潜在的误解和错误。当函数声明非常量引用参数时,它表示其意图修改该对象并将其返回给调用者。将临时参数传递给此类参数是不合逻辑的,因为一旦函数返回,它将被销毁。

解决方法:

要解决此编译错误,请考虑以下解决方法:

  • 创建一个临时变量:创建一个在将临时对象传递给函数之前保存临时对象的非临时变量:
Foo foo42(42);
ProcessFoo(foo42);
登录后复制
  • 使用常量引用: 修改函数以采用常量引用参数:
void ProcessFoo(const Foo& foo)
登录后复制
  • 经过值:允许函数将对象作为值参数:
void ProcessFoo(Foo foo)
登录后复制

为什么 MSVC 允许它:

不清楚为什么 Microsoft Visual Studio (MSVC) 允许编译此代码,而 g 则不允许。在这方面,MSVC 对 C 标准可能有不同的解释。通常建议遵循标准以确保不同编译器之间的行为一致。

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

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