C++:使用std :: ignore返回std :: tie的类型

eol*_*old 5 c++ stl tuples undefined-behavior c++11

我想知道C++ 11标准是否对某些参数的返回类型有任何要求.std::tuplestd::tiestd::ignore

更具体地说,我可以假设:

  1. decltype(std::tie(42, std::ignore)) 是不一样的 decltype(std::tie(std::ignore, 42))
  2. decltype(std::tie(42, std::ignore)) 是不一样的 decltype(std::tie(42))
  3. decltype(std::tie(std::ignore, 42)) 是不一样的 decltype(std::tie(42))
  4. decltype(std::tie(std::ignore, std::ignore)) 是不一样的 decltype(std::tie(std::ignore))

换句话说,从类型的角度来看,生成的元组是否表现为一个元组,它具有按位置decltype(std::ignore)匹配std::ignore的所有模板参数的类型?

Sir*_*Guy 4

是的,您可以,std::tie返回一个std::tuple<T&...>其中T...指定给它的类型。
std::ignore有一个未指定的类型,但它仍然会tuple根据您在 中指定的位置出现在 中std::tie

如果让您感觉更好,您可以在代码中的某个位置包含:

    int n;
    auto i = std::tie(std::ignore, n);
    auto j = std::tie(n, std::ignore);
    auto k = std::tie(n);
    static_assert(!std::is_same<decltype(i), decltype(j)>::value, "");
    static_assert(!std::is_same<decltype(i), decltype(k)>::value, "");
    static_assert(!std::is_same<decltype(j), decltype(k)>::value, "");
Run Code Online (Sandbox Code Playgroud)

对于您明确使用的任何组合,依此类推。这样,如果您的假设无效,编译将会失败。