C++ 这是std::bitset::operator^=和std::bitset::count的正常行为吗?若然,原因为何?

C++ 这是std::bitset::operator^=和std::bitset::count的正常行为吗?若然,原因为何?,c++,c++11,stl,bitset,C++,C++11,Stl,Bitset,如文件所述,std::bitset::operator^=返回*此。根据这一点以及诸如+=,|=,*=等运算符的“通常”解释,可以合理地假设给定std::bitset实例(大小相同)a和b,表达式(a^=b).count()将按位XOR操作的结果存储在a中,而count()将返回a中设置为true的位数。但是,正如下面的示例所示,发生了一些意想不到的事情: #include <iostream> #include <bitset> int main() { co

如文件所述,
std::bitset::operator^=
返回
*此
。根据这一点以及诸如
+=,|=,*=
等运算符的“通常”解释,可以合理地假设给定
std::bitset
实例(大小相同)
a
b
,表达式
(a^=b).count()
将按位
XOR
操作的结果存储在
a
中,而
count()
将返回
a
中设置为
true
的位数。但是,正如下面的示例所示,发生了一些意想不到的事情:

#include <iostream>
#include <bitset>

int main()
{
    constexpr unsigned int N=6; 
    std::bitset<N> a; 
    std::bitset<N> b; 

    a.flip();//111111
    b[0]=1;
    b[4]=1;//b is now 010001 (assuming least significan bit on the right end of the string)

    std::cout<<"a=="<<a.to_string()<<std::endl;
    std::cout<<"b=="<<b.to_string()<<std::endl;
    std::cout<<"(a xor b) to string=="<<(a^=b).to_string()<<std::endl;

    //Here is the unexpected part!
    std::cout<<"(a xor b) count=="<<(a^=b).count()<<std::endl;
    //Note that the following lines would produce the correct result
    //a^=b;
    //std::cout<<a.count()<<std::endl;


    return 0;
}

快速查看一下std::bitset(请参阅)的实现,似乎表明返回的引用确实是对lhs对象的引用(在我的示例中为
A
)。所以为什么会发生这种情况?

这与位集无关。考虑这个代码:

int a = 2;
int b = 3;
std::cout << std::to_string(a *= b) << std::endl; // Prints 6.
std::cout << std::to_string(a *= b) << std::endl; // Prints 18.
inta=2;
int b=3;

std::不能使用
(a^b).count()
,而不能使用
(a^=b).count()
。您正在分配
a
,并来回切换位状态。
(a^=b)
将被计算两次。问题是您的注释是错误的。用替代品替换“断开”行会产生相同的输出。除非你想保持“坏”的线和交替的。在C++中,作为一个经验法则,如果你使用字符<代码>=<代码>,那么你所做的描述将涉及“相等”一词。在
a^=b
的情况下,它是“a等于a^b”,在
a==b
的情况下,它是“a等于b”等等,有许多运算符具有a=
^
is
xor
^=/code>is
xor
赋值。您不想修改
a
,只想得到
a或b的结果。
int a = 2;
int b = 3;
std::cout << std::to_string(a *= b) << std::endl; // Prints 6.
std::cout << std::to_string(a *= b) << std::endl; // Prints 18.