C++ 按值赋值还是按引用赋值? SomeStruct getSomeStruct(); const SomeStruct a=getSomeStruct(); const SomeStruct&b=getSomeStruct();

C++ 按值赋值还是按引用赋值? SomeStruct getSomeStruct(); const SomeStruct a=getSomeStruct(); const SomeStruct&b=getSomeStruct();,c++,C++,我理解按值传递与按引用传递与按常量引用传递之间的区别。我的问题是,上述示例是否与向函数传递参数时相同?因此b的赋值更快,因为它不必复制数据,这与a的赋值不同 b的赋值更快,因为它不需要复制数据,不像a的赋值 没有。在复印方面没有区别 您所做的是将引用绑定到临时对象。在这种特殊情况下,临时对象的生存期将扩展到完整表达式之外,以匹配引用的生存期。程序的行为实际上与您未使用引用时的行为相同。在这里使用引用有一个缺点,程序员可能会被它的含义所迷惑,除非他们知道这个生命周期扩展规则 当您知道函数不返回引用

我理解按值传递与按引用传递与按常量引用传递之间的区别。我的问题是,上述示例是否与向函数传递参数时相同?因此
b
的赋值更快,因为它不必复制数据,这与
a
的赋值不同

b的赋值更快,因为它不需要复制数据,不像a的赋值

没有。在复印方面没有区别

您所做的是将引用绑定到临时对象。在这种特殊情况下,临时对象的生存期将扩展到完整表达式之外,以匹配引用的生存期。程序的行为实际上与您未使用引用时的行为相同。在这里使用引用有一个缺点,程序员可能会被它的含义所迷惑,除非他们知道这个生命周期扩展规则

当您知道函数不返回引用时,没有理由使用这样的引用。如果函数确实返回了引用,那么您可以通过使用引用来避免复制。复制是比通过引用间接寻址快还是慢取决于类型


生命周期扩展很有用的一种情况是,在模板中,您不知道函数是否返回引用或引用包装器(这是一个对象,即不是引用,但由于重载运算符,在某些方面的行为与引用类似)。临时寿命延长允许两种情况以相同的方式运行。

在扩展的eeroika答案中,延长寿命规则有例外:

  • 在return语句中临时绑定到函数的返回值不会被扩展。该值在返回表达式完成执行后立即被销毁,并将导致悬空引用
  • 在包含该函数调用的完整表达式结束之前,函数调用中引用参数的临时绑定一直存在:如果函数返回的引用超过完整表达式,则它将成为悬空引用
  • 与新表达式中使用的初始值设定项中的引用的临时绑定存在,直到包含该新表达式的完整表达式结束,而不是初始化对象结束。如果初始化的对象超过完整表达式,则其引用成员将成为悬空引用
现在,如果您使用的是c++14或更低版本,您还可以:

  • 与构造函数初始值设定项列表中引用成员的临时绑定仅在构造函数退出之前持续存在,而不是只要对象存在。(注意:截至1696年DR,此类初始化的格式不正确)
使用c++20,他们添加了:

  • 使用直接初始化语法(括号)而不是列表初始化语法(大括号)初始化的聚合的引用元素中的引用的临时绑定一直存在,直到包含初始值设定项的完整表达式结束
这些都来自本网站:


您还需要注意这些异常,以防止使用悬挂引用

它取决于
getSomeStruct
本身的签名。但是是的,假设完整签名是
const SomeStruct&getSomeStruct()
,那么
b
是在避免复制。请注意,在这两种情况下都没有赋值,仅初始化。@CoryKramer I在中的postSee讨论中添加了函数的签名,
a
的初始化也不需要副本-对象的创建方式与
b
绑定到的(临时)对象完全相同。现代编译器非常聪明。