友 我碰巧错误地写了这段代码:
const std::vector<int> &FunctionReturnReferenceToVector();
vector<int> tmp;
/*do something else*/
tmp = FunctionReturnReferenceToVector();
编译器没有抱怨,我的程序成功结束,结果正确。
请问整个过程到底发生了什么?
我使用了CLion IDE和Clang作为编译器。
答案 0 :(得分:1)
答案 1 :(得分:1)
tmp
将成为返回的向量内容的副本。在这种情况下,FunctionReturnReferenceToVector
返回向量的事实并不重要,因为您的代码正在调用复制赋值运算符。
答案 2 :(得分:1)
从你的问题中不清楚是否提到了一个向量。我假设它是从函数返回的:
users duck
在这种情况下,const std::vector<int> &FunctionReturnReferenceToVector();
只需使用赋值运算符tmp = FunctionReturnReferenceToVector()
将向量复制到变量tmp
。
要使用原始向量进行操作,可以为返回的向量分配const引用:
std::vector<int>::operator=(const std::vector<int>&)
答案 3 :(得分:1)
如果您查看the assignment operator of std::vector<>
(以及the copy constructors),您会看到没有按值vector<>
>
无论如何都是通过引用传递(然后由复制构造函数复制,这就是为什么它被称为 copy 构造函数)。
参考通常和真实的东西一样好。&#34;。只要向量FunctionReturnReferenceToVector()
返回对的引用仍然存在,一切都很好......
确实仍然存在,是吗?如果它只存在于该功能的本地,那你就麻烦了。 ; - )