这些形式之间有什么区别吗:返回类型与返回类型和?
Is there any difference between these forms : returnType vs returnType &?
考虑这些免费的独立函数:
std::vector<int>& f(); //reference
std::vector<int> g(); //value
/*const*/ std::vector<int>& f1 = f(); //reference
std::vector<int> f2 = f(); //value
/*const*/ std::vector<int>& g1 = g(); //reference
std::vector<int> g2 = g(); //value
之间有什么区别吗
f()和g()。这是一个简单的问题,但我仍然希望听到一些关于它们的详细评论,因为这可能有助于理解下一个问题的答案。
f1和f2。它们是来自f()的相同原始对象,还是f2将是原始对象的副本?取消
const
的注释会有什么不同?g1和g2。它们是来自g()的相同原始对象,还是g2将是原始对象的副本?取消
const
的注释会有什么不同?
如果f()
和g()
是成员函数,并且每个函数都返回成员数据,而不是某个局部变量,该怎么办?以上问题的答案会有什么不同吗?
请尝试在你的答案中包括所有的陷阱和要点,不要考虑RVO或编译器的任何其他优化。我想知道C++是什么,而不是编译器是做什么的。如果你谈论优化,请明确提到它,这样我就不会把语言功能和编译器功能混合在一起。
f()
返回对对象的引用;从中返回不会复制任何对象。g()
至少在概念上返回一个对象的副本。
std::vector<int>& f1 = f(); //reference
f1
是指f()
返回引用的对象。没有复制。引用的Const限定在这里没有区别(就复制而言;显然它会影响对对象的处理)。
std::vector<int> f2 = f(); //value
f2
是f()
返回引用的对象的副本。
std::vector<int>& g1 = g(); //reference
这是无效的。非常量引用不能绑定到临时对象。
如果引用是const限定的,那么这一行实际上与下一行相同:生成g()
返回的对象的副本,引用绑定到该副本,并且该副本被赋予引用的生存期(当引用被"销毁"时,它被销毁)。
std::vector<int> g2 = g(); //value
CCD_ 12是CCD_ 13返回的对象的副本。是否制作副本(以及可以制作多少副本)取决于编译器优化。
如果
f()
和g()
是成员函数,并且每个函数都返回成员数据,而不是某个局部变量,该怎么办?
如果f()
返回对局部变量的引用,则程序是不正确的,如果您试图使用该引用,则会产生未定义的行为,因为当函数返回时,被引用的对象将不存在。
如果f()
返回对成员变量、动态分配的对象或具有静态或线程本地存储持续时间的对象的引用,则该引用在该对象的生存期内有效(或者对在内存中与返回引用的对象相同的位置构造的同一类型的另一个对象有效,尽管其实用性仅限于少数情况)。
g()
返回什么并不重要,因为总是会进行复制(至少在概念上是这样)。
- 如何获取std::result_of函数的返回类型
- 奇怪的结构&GCC&clang(void*返回类型)
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 函数作为模板参数,是否对返回类型强制约束
- C++中函数的向量返回类型引发错误
- 检查函数返回类型是否与STL容器类型值相同
- 为什么返回类型中需要typename?C++
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 返回类型中 && 和没有引用之间的区别
- C++方法的区别仅在于返回类型(和常量)的"恒常性"
- decltype(auto)和decltype(return expr)作为返回类型有什么区别?
- 有人能解释一下这些函数返回类型的区别吗?
- 这些形式之间有什么区别吗:返回类型与返回类型和?
- c++中引用返回类型和指针返回类型有什么区别?