gpt4 book ai didi

c++ - 添加 : in front of variable gives wrong result

转载 作者:行者123 更新时间:2023-12-03 06:51:38 24 4
gpt4 key购买 nike

我在比较类(class)。对于下面的代码

#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 的字段store 是引用,对于位域有一个特殊的规则,其中生成位域的临时拷贝,并且引用绑定(bind)到该临时域。这意味着当您从函数返回时,对位字段的引用是悬空的,当您使用 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);
};

关于c++ - 添加 : in front of variable gives wrong result,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63957051/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com