Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;通过引用接收函数返回_C++_Reference - Fatal编程技术网

C++ C++;通过引用接收函数返回

C++ C++;通过引用接收函数返回,c++,reference,C++,Reference,假设我们有一个函数 int increment(int x) { return x+1; } 通过接收返回值会有什么不同吗 const int foo = increment(8); 或 ? 如果返回类型是更复杂、更大的对象,该怎么办?使用引用来避免不必要的副本有意义吗 我认为返回的值超出了函数的范围(increment,在本例中)。所以无论如何都需要一份。对吗 通过…接收返回值有什么不同吗 两者都有相同的可观察行为,这在某种意义上没有区别 从主观上讲,使用指称更为复杂,理解指称需要掌握

假设我们有一个函数

int increment(int x) {
  return x+1;
}
通过接收返回值会有什么不同吗

const int foo = increment(8);

?

如果返回类型是更复杂、更大的对象,该怎么办?使用引用来避免不必要的副本有意义吗

我认为返回的值超出了函数的范围(
increment
,在本例中)。所以无论如何都需要一份。对吗

通过…接收返回值有什么不同吗

两者都有相同的可观察行为,这在某种意义上没有区别

从主观上讲,使用指称更为复杂,理解指称需要掌握更多的语言规则,这是有区别的。据我所知,临时人员的寿命延长是一个有点模糊的语言规则,初学者对这一规则了解甚少

如果返回类型是更复杂、更大的对象,该怎么办

没关系

使用引用来避免不必要的副本有意义吗

无需复制。引用版本不创建局部变量,而是创建临时对象,并将引用绑定到临时对象。在这里使用引用是没有意义的

通过…接收返回值有什么不同吗

两者都有相同的可观察行为,这在某种意义上没有区别

从主观上讲,使用指称更为复杂,理解指称需要掌握更多的语言规则,这是有区别的。据我所知,临时人员的寿命延长是一个有点模糊的语言规则,初学者对这一规则了解甚少

如果返回类型是更复杂、更大的对象,该怎么办

没关系

使用引用来避免不必要的副本有意义吗


无需复制。引用版本不创建局部变量,而是创建临时对象,并将引用绑定到临时对象。在这里使用引用是没有意义的。

由于RVO(自C++17以来是强制性的),第一个示例中没有副本。对于C++17,即使返回类型是没有复制或移动构造函数的类,也可以通过值返回。第二种方法在技术上是有效的,但毫无意义。
int increment(x)
-我想你的意思是:
int increment(int x)
?谢谢Igor。你的意思是没有两个例子的拷贝(参考或不),因为C++ 17。对的C++17之前的版本怎么样?说C++11。@selbie你说得对。C++98已经允许RVO了。几乎从永远以来,所有主流编译器都实现了RVO。C++17只是编纂了现有的实践。由于RVO(自C++17以来是强制性的),第一个示例中没有副本。对于C++17,即使返回类型是没有复制或移动构造函数的类,也可以通过值返回。第二种方法在技术上是有效的,但毫无意义。
int increment(x)
-我想你的意思是:
int increment(int x)
?谢谢Igor。你的意思是没有两个例子的拷贝(参考或不),因为C++ 17。对的C++17之前的版本怎么样?说C++11。@selbie你说得对。C++98已经允许RVO了。几乎从永远以来,所有主流编译器都实现了RVO。C++17只是编纂了现有的实践。在
decltype(foo)
的情况下会有不同的可观察行为
decltype(foo)
const int& foo = increment(8);