引用绑定和复制构造函数/移动构造函数

时间:2017-03-31 11:22:42

标签: c++

如果我有这样的功能:

int foo(std::vector<int>* integer1ArrayIn, * integer2ArrayIn) {
    std::vector<int>& integer1Array = *integer1ArrayIn;
    std::vector<int>& integer2Array = *integer2ArrayIn;
}
  1. 引用integer1Array是否会调用复制构造函数/移动构造函数来复制传入参数的元素?
  2. 绑定对解除引用指针的引用是否会调用复制构造函数?
  3. 引用绑定在什么情况下会调用复制构造函数?
  4. 有人能解释一下这段代码在内存中执行会发生什么吗?
  5. 谢谢

2 个答案:

答案 0 :(得分:2)

1)不,没有制作副本。您可以使用小型程序对其进行测试,例如this

${platName.replaceAll("(\\p{Ll})(\\p{Lu})","$1 $2")}

2)小心#include <iostream> struct foo { foo() { std::cout << "Constructor" << std::endl; } foo(const foo&) { std::cout << "Copy constructor" << std::endl; } foo& operator=(const foo&) { std::cout << "Copy assignment operator" << std::endl; } }; int main() { foo* A = new foo; foo& B = *A; delete A; } s!否则一切都很好。

3)从不(见AlexG的回答)

4)不确定“代码在内存中执行”的含义,因为代码未在内存中执行。如果你的意思是程序执行时内存会发生什么,那就是另一个故事

答案 1 :(得分:2)

  1. 没有
  2. 不,如果它是nullptr,它会严重崩溃。当参数HAS存在时,请考虑通过引用传递,并在参数MIGHT存在时通过指针传递(但总是验证nullptr!)。
  3. 只要l值(在本例中为dataloaderinteger1Array)是指针或引用,它就永远不会调用复制/移动构造函数。
  4. 如果你有integer2Array,它会有效地制作副本。

    您可以使用Jonas的答案来玩弄并亲眼看看:)