在C ++标准库中,有一个名为pair的对象。 Pair.first和Pair.second分别返回pair对象的第一个和第二个值。我想在条件下将第一个值递增一(我的对是一对)。当我尝试这样做时,它正在抛出“需要1值”。这可能是因为我不是通过引用传递值的某个地方,但它也可能是.first不会通过引用返回该对的第一个值。 有谁知道它是否存在?
答案 0 :(得分:6)
first
不是一个函数,它本身就是一个对象,是struct pair
的数据成员。对象的名称是左值,相当于引用。
“Lvalue”是一个语言术语,表示可以在作业的左侧,即可以为其赋值,或者在内存中有一个有意义的地址。
如果条件表达式的两个替代值都是相同类型的左值,则条件表达式的结果是左值。
例如,
pair< int, int > p;
flag? p.first : p.second = 34; // ok
flag? p.first : 3 = 15; // error: 3 is not an lvalue; 3 = 15 is nonsense
pair< int, short > q;
flag? q.first : q.second = 12; // error: different types
注意,对于赋值的右侧,“左值”的反义词是“rvalue”。这些术语来自C语言。
记住:表达式的左值是存储它的位置,右值是它的内容。这些表达式中哪一个有意义地决定了它的值类别。
答案 1 :(得分:1)
首先,我认为你所读到的“需要1值”实际上是“需要左值”(L值),它在C ++中是一个表达式(直观地)代表一个实际的对象,而不是一个值。
接下来,pair.first
和pair.second
不会引用对pair.first
和pair.second
的引用,而是 first
和second
内的pair
个数据成员。您可以获取对它们的引用,但它们本身不是引用。
但是,如果没有看到实际的代码,我就无法提供更有针对性的建议。
希望这有帮助!