这有点相反于所有“lvalue required as left operand of assignment”错误的问题。
我有一个重载了operator[]的类,但只重载了返回临时对象的版本。如果它返回一个int:
struct Foo
{
int operator[]( int idx ) const { return int( 0 ); }
};
Foo f;
f[1] = 5;
如果返回一个左值,我将会得到正确的编译器错误。但是如果返回一个结构类型,编译器(在本例中为GCC 7.2)则不会发出任何警告:
struct Bar {};
struct Foo
{
Bar operator[]( int idx ) const { return Bar(); }
};
Foo f;
f[1] = Bar();
为什么如果Bar是一个临时变量并且它没有专门的运算符=,它就不会以同样的方式抱怨?
另一个问题是,有没有办法让这个程序报错?显然,如果以这种方式使用它,这是一个编码错误。
Bar() = Bar();
,这对我来说是可以编译的!我希望至少有一个警告。实时查看:https://godbolt.org/z/_IPcrd - Richard CrittenBar
的赋值运算符设为私有,则无法编译。另请参见防止返回值引用的复制构造和赋值。 - Håkon Hæglandobject[index] = Object()
时进行赋值?这对我来说似乎相当明显...所以我进行了测试...结果发现如果删除赋值运算符,它会报错...对我来说似乎已经得到证实了... - Brandon