繁体   English   中英

如果我将“对向量的引用”分配给“向量”会发生什么

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM