以下代码在gcc 4.8.1上编译没有问题:
#include <utility>
struct foo
{
};
int main()
{
foo bar;
foo() = bar;
foo() = std::move( bar );
}
似乎隐含生成的foo赋值运算符不是& ref-qualified,因此可以在rvalues上调用.根据标准,这是正确的吗?如果是这样,有什么理由不要求隐式生成的赋值运算符为&裁判资格?
为什么标准不要求生成以下内容?
struct foo
{
foo & operator=( foo const & ) &;
foo & operator=( foo && ) &;
};
解决方法:
嗯,有一些合法的用例分配给右值.引用Ref-qualifiers for assignment operators in the Standard Library:
There are only a few very specific types for which it makes sense to
support assigning to an rvalue. In particular, types that serve as a
proxy, e.g., vector<bool>::reference, and types whose assignment
operators are const-qualified (e.g., slice_array).
C标准委员会显然认为默认赋值不应该有一个隐式ref限定符 – 而应该明确声明它.实际上,如果突然所有隐式声明的赋值运算符都不能与rvalues一起使用,可能会有现有代码停止工作.
当然,我们想要一个隐含声明的赋值运算符与rvalues一起工作的例子有点难以设计,但C标准委员会可能不希望在保留向后兼容性时采取这种机会.像这样的代码:
int foo_counter = 0;
struct Foo
{
Foo()
{
++foo_counter;
}
~Foo()
{
--foo_counter;
}
};
int main()
{
Foo() = Foo();
}
……不再适用了.在一天结束时,标准委员会希望确保以前有效的C(无论多么愚蠢或做作)继续在C 11中发挥作用.