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

问题描述

所以我有一个myClass,并有两个私有变量,让我们说i,j和一个方法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

解决方法

std::pair的值是按值。

尽管您可以使用

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

作为类型。

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

,

在您的特定情况下,std::pair仅仅是这么多:

struct pair {
   int first;
   int second;
};
您的first中的

secondstd::pair是非引用类成员。 std::pair的完整定义几乎是

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

在您提供的示例中,由于您将类型声明为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;
};

但是,请注意,返回对私有数据的非常量引用会破坏封装。一旦调用者获得了非const引用,他们就可以直接修改私有数据,并且您可以(应该)将其公开,以减少样板并提高清晰度。