【问题标题】:Does pair.first return a reference to the first value?pair.first 是否返回对第一个值的引用?
【发布时间】:2013-07-08 23:41:59
【问题描述】:

在 C++ 标准库中,有一个对象叫做对。 Pair.first 和 Pair.second 分别返回 pair 对象的第一个和第二个值。我想在条件下将第一个值增加一个(我的一对是一对)。当我尝试这样做时,它会抛出“需要 1 值”。这可能是因为在某处我没有通过引用传递值,但也可能是 .first 没有通过引用返回该对的第一个值。 有谁知道有没有?

【问题讨论】:

  • 请显示 minimal 代码来显示您的问题。你描述它的方式,它应该可以工作(但它没有,所以有些可疑)。

标签: c++ reference standard-library std-pair


【解决方案1】:

first 不是函数,它本身就是一个对象,是struct pair 的数据成员。对象的名称是一个左值,相当于一个引用。

“左值”是一个语言术语,表示可以放在赋值左侧的东西,即可以为它分配一个值,或者它在内存中有一个有意义的地址。

如果条件表达式的两个替代项都是相同类型的左值,则条件表达式的结果是一个左值。

例如,

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

注意,“左值”的反义词是“右值”,用于赋值的右侧。这些术语是从 C 语言中借来的。

记住:表达式的左值是它的存储位置,右值是它的内容。其中哪个表达式有意义地决定了它的值类别

【讨论】:

    【解决方案2】:

    对于初学者,我认为您所阅读的“需要 1 值”实际上是“需要 lvalue”(L 值),它在 C++ 中是(直观地)表示的表达式一个实际的对象,而不是一个值的东西。

    接下来,pair.firstpair.second 不会产生对 pair.firstpair.second 的引用,而是 firstsecond 内部的 @987654327 数据成员@。您可以获得对它们的引用,但它们本身不是引用。

    虽然没有看到实际代码,但我无法提供更有针对性的建议。

    希望这会有所帮助!

    【讨论】:

    • Pairs 是实现 1 值到 2 值转换的标准方法:-)
    猜你喜欢
    • 2022-07-13
    • 2016-08-27
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2023-01-17
    • 2016-05-01
    • 2010-09-30
    • 2019-03-22
    相关资源
    最近更新 更多