std::pair<> 中的值是按引用还是按值存储的?

Are the values stored in std::pair<> by reference or by value?

所以我有一个 class myClass 和两个私有变量,比方说 i,j 和一个 class 方法 myMethod 如下-

std::pair<int, int > myClass::myMethod(void)
{
    std::pair<int, int> Pair;
    this->i = 100;
    this->j = 50;
    Pair.first = this->i;
    Pair.second = this->j;
    return Pair;
}

我正在从另一个函数调用方法如下-

std::pair<int, int> receivedPair = myClass.myMethod();

所以如果我编辑 receivedPair 让我们说

receivedPair.first = 200;

Class 变量 i 也会等于 200 吗? 我基本上需要通过引用将变量传递给一系列的几个函数,以便更新相同的内存位置.... TIA

A std::pair,在你的具体情况下,无非就是这么多的话:

struct pair {
   int first;
   int second;
};

firstsecond 在您的 std::pair 中是 non-reference class 成员。 std::pair的完整定义差不多

template<typename T1, typename T2> struct pair {
   T1 first;
   T2 second;
};

std::pair的值是按值计算的。

在你的情况下你可以使用

std::pair<std::reference_wrapper<int>, std::reference_wrapper<int>>

作为类型。

参考:https://en.cppreference.com/w/cpp/utility/functional/reference_wrapper

在您提供的示例中,值按值存储,因为您将类型声明为std::pair<int, int>。如果您希望通过引用存储值,您可以这样做:

std::pair<int&, int&> myClass::myMethod(void)
{
    this.i = 100;
    this.j = 50;
    std::pair<int&, int&> Pair(this.i, this.j);
    return Pair;
}

P.S。我只添加了这个答案,因为我认为之前带有 std::reference_wrapper 的答案不会让您修改参考的内容!然后我发现你可以使用 .get().

修改内容

std::pair 存储您告诉它的任何内容。您可以使用 std::pair<int&,int&>。但是,作为成员的引用有一些缺点。复制、默认构造等是有问题的/不可能的。

与其使用一对引用,不如使用一对引用可能更容易:

struct myClass {
    std::pair<int,int>& myMethod() {
        return data;
    }
    private:
    std::pair<int,int> data;
};

我声称,如果你不能给成员起比 ij 更好的名字,那么 data.firstdata.second 也一样好。另一方面,如果你能给出更好的名字,那就这样做:

struct my_i_and_j {
    int some_meaningful_name;
    int another_meaningful_name;
};

struct myClass {
    my_i_and_j& myMethod() {
        return data;
    }
    private:
    i_and_j data;
};

但是,请注意,返回对私有数据的 non-const 引用会破坏封装。一旦调用者获得 non-const 引用,他们就可以直接修改私有数据,而您 could/should 实际上将其设为 public 以减少 boiler-plate 并提高清晰度。