按类型和歧义提取元组的元素

Extracts the element of a tuple by type and ambiguity

本文关键字:元组 元素 提取 歧义 类型      更新时间:2023-10-16

文章指出,对于免费的std::get函数重载(从4-6项),它们

提取类型为t的元组t的元素。如果元组中有多个该类型的元素,则编译失败。

最后一句话是要求还是可能?

我问这个问题是因为std::get< int >(std::make_tuple(1, 2))通过clang++ -std=gnu++1z -stdlib=libc++编译得很好(实例)。这个元组的行为是一个libc++错误还是符合标准?

根据标准§20.4.2.6/8,要求是:

要求:类型T在Types....中只出现一次否则,程序是病态的。

所以你的程序是病态的。

标准甚至提供了一个与你的情况非常相似的例子:

const tuple<int, const int, double, double> t(1, 2, 3.4, 5.6);
const int &i1 = get<int>(t); // OK. Not ambiguous. i1 == 1
const int &i2 = get<const int>(t); // OK. Not ambiguous. i2 == 2
const double &d = get<double>(t); // ERROR. ill-formed

,如果你插入Clang编译器。