使用结构化绑定忽略?

序曲:

std::tuple<int, int, int> f();
std::tuple<int, int, float, int> g();

C + + 1z 将为结构化绑定引入语法,这将使编写代替

int a, b, c;
std::tie(a, b, c) = f();

比如

auto [a, b, c] = f();

但是,std::tie也允许指定 std::ignore来忽略某些组件,例如:

std::tie(a, b, std::ignore, c) = g();

Will it be possible to do something similar using the new structured bindings syntax? How would it work?

27789 次浏览

有可能使用新的结构化绑定语法做类似的事情吗?

不,你只需要编一个以后不会提到的变量名。

结构化绑定提案包含一个专门的部分来回答您的问题(P0144R2) :

3.8应该有明确忽略组件的方法吗?

这样做的动机是让编译器对未使用名称的警告保持沉默。 我们认为答案应该是“还没有”这不是由用例驱动的(沉默编译器警告是一个动机,但它本身不是一个用例) ,最好留到我们能够在一个更一般的模式匹配建议的上下文中重新讨论这个问题,这应该作为一个特殊的情况。

std::tie的对称性建议使用类似于 std::ignore的东西:

tuple<T1,T2,T3> f();


auto [x, std::ignore, z] = f(); // NOT proposed: ignore second element

然而,这感觉很尴尬。

预测语言中的模式匹配可能会建议使用通配符,比如 _或者 *,但是由于我们还没有模式匹配,所以现在选择一种我们知道会兼容的语法还为时过早。这是一个纯粹的扩展,可以等待模式匹配的考虑。

然而,请注意,该标准的工作草案目前正在由相关的国家机构(NB)进行修订,并且有一个 NB 评论要求这一特性(P0488R0,US100) :

分解声明应该提供抛弃一些返回值的语法,就像 std::tie使用 std::ignore一样。

我通常使用 _,它在 C + + 中是一个有效的标识符,但看起来与例如 Kotlin 的下划线操作符相同,它丢弃了 lambda 参数。 You'd end up with a nice code sth like this

map([&](auto it) {
auto [_, deviceServiceXAddr] = it;
return deviceServiceXAddr;
});