在 C++ 中传入 vs 分配 const 引用

Pass in vs assign const reference in C++

const string& x = functionA();

functionB(x); // depends on x is string or const string&
string str = x;

我们有 const ref x:

  1. 传递给函数B,所以基本上我们复制x的值并传递给函数B? (不是,取决于x是不是参考)

  2. 将x赋值给str,所以这里我们也复制了x的值?或者我们只是分配引用?

=======================

是的,我理解 functionB(x),这取决于传入的 x 是字符串还是字符串&。我现在的困惑仍然是第二个关于赋值的问题。

如果我们有这样的东西:

obj.fieldA = x;

obj已经创建,我们只是将x赋值给obj的fieldA。那么这里的 x 是副本还是只是参考?

  1. 用 'x' 调用 'functionB' 我们只是传递这个引用持有的那个值。
    顺便说一下,引用的行为与指针非常相似。 它类似于:
    void func(int val);

    int a = 11;
    int *ptr = &a;
    func(*ptr); // same as functionB(x);

所以你是否通过复制传递它实际上取决于函数B的形式参数;

  1. 我们这里也有类似的情况。
    在这一行中:
    string str = x;
    您正在通过将引用 'x' 持有的值传递给它的构造函数来初始化(创建)字符串 'str' (不要与赋值混淆,因为 str 是在这一行创建的),并且因为我们有由于移动语义,构造函数分离,在这里您将通过 const 引用将 'x' 传递给 'str' 的构造函数以复制它。

更新:
这个 obj.fieldA = x; 意味着你已经创建了,比方说,Object obj;
据此,语句 obj.fieldA = x; 将只是 'x'.
的复制 也许我不明白你最后一个问题,但假设 fieldA 又是 'string' 类型;
然后,当你写 obj.fieldA = x; 时,会调用类似(非常糟糕的例子,只是为了简化):

string& operator=(const string& other){
    ..
    this->str_pointer = new char[other.size() + 1];
    strcpy(this->str_pointer, other.str_pointer);
    ..
} 


这意味着这个函数获取了 'x' 的地址并复制了它的数据。
总结:

string first = "text";
const string& x = first; // x behaves just like a pointer and holds address of 'first'
Object obj;
obj.fieldA = x; // <--- here

在我由于 'operator=' 声明接收引用(地址)而标记的行中,您将只传递 'x' 的地址,然后 'operator=' 将查看此内存地址并复制一份数据,放在那里。
所以,我们只是将 'x' 的值分配给 .fieldA,而不是引用。