这个答案列出了 C++17 分解声明的一些缺点(该功能以前称为“结构化绑定”)。例如,您不能为新变量指定显式类型,等等。但是那里没有提到我遇到的一个大缺点,所以我想知道是否有一种我没有想到的已知解决方法。
考虑这个 JSON 解析代码(可能包含其他错误;出于本问题的目的,请忽略它们):
using Value = std::any;
using String = std::string;
using Object = std::map<String, Value>;
std::pair<String, const char *> load_string(const char *p, const char *end);
std::pair<Value, const char *> load_value(const char *p, const char *end);
const char *skip_spaces(const char *p, const char *end);
std::pair<Object, const char *> load_object(const char *p, const char *end)
{
p = skip_spaces(p, end);
if (p == end || *p++ != '{') throw ParseError("Expected {");
p = skip_spaces(p, end);
Object result;
if (p == end && *p == '}') {
// the object has no key-value pairs at all
} else {
while (true) {
auto [key, p] = load_string(p, end);
p = skip_spaces(p, end);
if (p == end || *p++ != ':') throw ParseError("Expected :");
auto [value, p] = load_value(p, end);
result.insert_or_assign(std::move(key), std::move(value));
p = skip_spaces(p, end);
if (p == end) throw ParseError("Expected , or }");
if (*p == '}') break;
if (*p++ != ',') throw ParseError("Expected , or }");
}
}
return {result, p+1};
}
这会很好用,除了开始auto [key, p] =
和auto [value, p] =
无效的行!该变量p
已被声明。我正在尝试分配p
一个新值,但我不想创建一个全新的局部变量。
我宁愿不使用,因为这需要我在分配之前std::tie(key, p) =
给出声明。key
这是老生常谈的反对意见std::tie
。我可以发誓这就是将结构化绑定引入语言的原因!
那么是否有任何解决方法 - 编写组合构造的任何干净的方式key
- 就地和分配给 -p
表达我的意图?
奇怪的是,我以前从未错过过这个功能,但是一旦你给我结构化绑定来玩,我尝试的第一件事就不起作用。:(