gpt4 book ai didi

c++ - 重载运算符 [] 并没有得到 "lvalue required as left operand of assignment"错误

转载 作者:IT老高 更新时间:2023-10-28 22:20:33 26 4
gpt4 key购买 nike

这与所有“需要左值作为赋值的左操作数”错误问题有点相反。
我有一个重载运算符 [] 的类,但只有返回临时的版本。如果要返回一个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 是临时的并且没有专门的运算符 =,为什么不会以同样的方式提示?另一个问题,有没有办法让这个提示?如果以这种方式使用,显然这是一个编码错误

最佳答案

is there some way to make this complain?

您可以使用带有引用限定符的显式默认赋值运算符:

struct Bar {
Bar& operator=(const Bar&) & = default;
// ^

这使得右值的赋值格式不正确,而左值的赋值仍然格式正确。

请注意,声明赋值运算符会禁用隐式移动赋值,因此如果需要,您可能还需要定义它(也可以作为默认值,如果合适,还可以使用右值 ref 限定符)。

Why wouldnt this complain in the same way if Bar is a temporary and it doesnt have an specialized operator =?

因为隐式生成的赋值运算符没有引用限定。

Clearly this is a coding error if it were to be used this way

右值的赋值并不是普遍的错误。对于某些应该表现得像引用的类型,分配右值是很自然的。之所以如此,是因为赋值修改了引用的对象,而不是临时对象本身。

一个典型的用例是赋值给一个右值std::tie(来自cppreference的例子):

std::set<S> set_of_s; // S is LessThanComparable

S value{42, "Test", 3.14};
std::set<S>::iterator iter;
bool inserted;

// unpacks the return value of insert into iter and inserted
std::tie(iter, inserted) = set_of_s.insert(value);

是的,考虑到引用类型是异常(exception)而不是规范,如果隐式运算符是合格的,并且非限定运算符需要显式声明可能会更好。但语言不是这样的,改变它是一种向后不兼容的改变。

关于c++ - 重载运算符 [] 并没有得到 "lvalue required as left operand of assignment"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56639421/

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