【发布时间】:2017-03-04 00:05:01
【问题描述】:
This SO answer 列出了 C++17 分解声明的一些缺点(该功能以前称为“结构化绑定”)。例如,您不能为新变量指定显式类型,等等。但是那里没有提到我遇到的一个大缺点,所以我想知道是否有我没有想到的已知解决方法。
考虑this JSON-parsing code(可能包含其他错误;出于本问题的目的,请忽略它们):
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-in-place-and-also-assign-to-p 表达我的意图?
奇怪的是,我以前从未错过过这个功能,但是一旦你给我结构化绑定来玩,我尝试的第一件事就不起作用。 :(
【问题讨论】:
标签: c++ refactoring c++17 structured-bindings