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

时间:2015-10-26 09:43:10

标签: c++ clang tuples libc++ iterable-unpacking

The article声明免费std::get功能过载(4-6项)

  

提取类型为T的元组t的元素。如果元组具有多个该类型的元素,则无法编译。

最后一个陈述是要求还是仅仅是一种可能性?

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

1 个答案:

答案 0 :(得分:2)

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

  

要求:类型T在类型中恰好出现一次....否则,程序格式不正确。

所以你的程序结构不合理。

该标准甚至提供了一个与您的情况非常相似的示例:

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

如果您plug in Clang编译。