[英]what happens if I assign “reference to vector” to “vector”
朋友,我碰巧错误地写了这段代码:
const std::vector<int> &FunctionReturnReferenceToVector();
vector<int> tmp;
/*do something else*/
tmp = FunctionReturnReferenceToVector();
编译器没有抱怨,我的程序以正确的结果成功结束。
请问在整个过程中到底发生了什么?
我使用CLion IDE和Clang作为编译器。
您的载体将被复制。 tmp
将是参考引用的向量的副本。 您可以在自己的有趣示例中看到此行为。 像这样:
struct Copy {
Copy(int in) : _i(in) {}
// Copy assignment, just like std::vector!
Copy& operator=(const Copy& copy) {
_i = copy._i;
std::cout << "I was Copied!\n";
}
int _i;
};
Copy a(3), b(5), &c = b;
a = c;
和输出,您可以猜测:
我被复制了!
tmp
将成为返回的向量内容的副本。 在这种情况下, FunctionReturnReferenceToVector
返回向量的事实并不重要,因为您的代码正在调用复制分配运算符。
从您的问题中尚不清楚引用向量来自何处。 我假设它是从函数返回的:
const std::vector<int> &FunctionReturnReferenceToVector();
在这种情况下, tmp = FunctionReturnReferenceToVector()
只需使用赋值运算符std::vector<int>::operator=(const std::vector<int>&)
将向量复制到变量tmp
。
要使用原始向量,可以将const引用分配给返回的向量:
const auto &tmp = FunctionReturnReferenceToVector();
如果查看std::vector<>
的赋值运算符 (以及复制构造函数 ),您会发现没有一个按值将另一个vector<>
接受 。
无论如何,它们都是通过引用传递的 (然后由复制构造函数复制,这就是为什么它被称为复制构造函数的原因)。
引用通常与“真实”一样好。 只要向量FunctionReturnReferenceToVector()
返回对仍然存在的引用,一切都很好...
它确实还存在,不是吗? 如果它仅在该函数中本地存在,则您会遇到麻烦。 ;-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.