【问题标题】:Are tuples of tuples allowed?允许元组的元组吗?
【发布时间】:2010-07-15 09:55:29
【问题描述】:

我目前正在研究一个包含大量模板的类,并且能够构建元组的元组会使它更容易

但我在 MSVC++ 2010 中尝试了这个简单的代码:

#include <tuple>

void main() {
     auto x = std::make_tuple(std::make_tuple(5, true));
}

我得到一个编译错误。如果我不使用std::make_tuple 而是直接使用std::tuple 的构造函数,也会出现同样的问题。

这是 MSVC 的错误还是标准不允许元组的元组?

【问题讨论】:

  • 您收到的确切错误消息是什么?
  • 非常非常长初始错误是:c:\logiciels\visual studio 10.0\vc\include\tuple(127): error C2440: 'initializing' : cannot convert from 'std::tr1 ::_Nil' 到 'bool'
  • 我怀疑微软的元组实现是递归的,但是由于 Type0 已经是一个元组,它会与其他东西发生冲突
  • 这在 g++ 4.5 上也失败了,但 std::make_tuple(std::make_tuple(5, true), 0); 没问题。
  • 您的代码也可以在 VC++2010 中编译,您认为这是标准禁止的还是两种实现中的错误?

标签: c++ visual-studio c++11 visual-c++ tuples


【解决方案1】:

更多数据点:

  • 如果我们使用 std::tr1::tuple 并显式声明类型而不是使用 auto,则 Visual C++ 2008 编译代码不会出错。尝试使用 Visual C++ 2010 编译相同的代码会导致您看到的错误。

  • 如果我们使用 boost::tuple 显式声明类型而不是使用 auto,则 Visual C++ 2008 和 Visual C++ 2010 都可以正确编译代码。

看起来这可能是一个实现错误。

【讨论】:

    【解决方案2】:

    您创建了一个只有一个成员的元组 --- 这不是违背了元组的目的吗?无论如何,我怀疑这会导致歧义。

    make_tuple 将类型推断与对tuple 构造函数的调用相结合。当tuple 构造函数使用一个参数调用时,该参数也是tuple,转换构造函数可能比包装构造函数更适合。于是就有了问题。

    允许元组的元组。 1-Tuples 可能不是。

    【讨论】:

      猜你喜欢
      • 2016-09-08
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      相关资源
      最近更新 更多