微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在变量前面添加:会导致错误的结果

如何解决在变量前面添加:会导致错误的结果

我正在上课。对于以下代码

#include <string>
#include <set>
#include <tuple>
#include <cassert>


enum class e : bool
{
    positive = true,negetive = false
};


class A
{
public:
    int a;
    e e1 : 1;
    
  friend bool operator==(const A&,const A&);
};

 
 bool operator==(const A& lhs,const A& rhs) {
  auto tie = [](const A& a1) {
    return std::tie(a1.a,a1.e1);
  };
  auto x1 = tie(lhs);
  auto x2 = tie(rhs);
  return x1 == x2;   
}

int main()
{
A a1;
a1.a = 10;
a1.e1 = e::positive;

A b1;
b1.a = 10;
b1.e1 = e::positive;

assert(a1 == b1);

}

输出为:

a.out: main.cpp:44: int main(): Assertion `a1 == b1' Failed.

这是错误的,因为两个类是相同的。

但是,如果我将代码行从e e1 : 1;更改为e e1;,则会得到正确的结果。

我首先想知道:在这种情况下会做什么? 为什么添加此后结果是错误的?

可以看到代码here.

谢谢。

解决方法

此功能:

auto tie = [](const A& a1) {
    return std::tie(a1.a,a1.e1);
};

返回一个std::tuple<int const&,e const &>。即使tuple存储的字段是引用,对于位字段也有一个特殊的规则,在该规则中会生成位字段的临时副本,并将引用绑定到该临时字段。这意味着当您从函数返回时,对位字段的引用是悬空的,当您稍后使用tuple的该字段时,会导致未定义的行为。

您可以通过明确指定返回类型来解决此问题:

auto tie = [](const A& a1) -> std::tuple<int,e> {
    return std::tie(a1.a,a1.e1);
};

这里是demo

或者,您可以返回一个tuple来衰减参数类型,并避免出现悬挂问题,如下所示:

auto tie = [](const A& a1) {
    return std::make_tuple(a1.a,a1.e1);
};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。