为何std::optional<std::reference_wrapper>返回值无法直接赋值?
问题原因
你用std::optional<std::reference_wrapper<std::string>>作为返回值时,data::tbl(4, 0)返回的是一个std::optional对象,不是直接的字符串引用。直接写= "Col: 2, Row: 0"本质是想把字符串赋值给这个optional对象,但std::optional并没有定义接受字符串或C风格字符串的赋值运算符,所以编译通不过。而不包optional时,返回的是直接的字符串引用,自然能直接赋值。
解决方案
要修改单元格内容,得先拿到optional内部的引用包装器,再操作底层字符串,常用两种方式:
- 用
std::optional::value()(索引非法时会抛出std::bad_optional_access异常):
data::tbl(4, 0).value() = "Col: 2, Row: 0";
std::reference_wrapper<std::string>重载了operator=,赋值时会自动转发给底层的std::string。
- 用解引用运算符
*(得确保optional有有效值,否则行为未定义):
*data::tbl(4, 0) = "Col: 2, Row: 0";
解引用后得到的是引用包装器对象,同样可以直接赋值。
如果不想触发异常,也可以先判断optional是否有效再操作:
if (auto cell = data::tbl(4, 0)) { *cell = "Col: 2, Row: 0"; }
内容的提问来源于stack exchange,提问作者Marcin Pagórek
相关产品推荐
相关产品推荐

