C++ 无法创建包含空元组的一元元组(c+;+;0x)

C++ 无法创建包含空元组的一元元组(c+;+;0x),c++,c++11,tuples,C++,C++11,Tuples,我在尝试元组时遇到了创建元组的问题。 代码示例如下所示 //a.cpp #include <tuple> using namespace std; int main() { auto te = make_tuple(); //this line is ok auto tte = make_tuple(te); //this line gives an error. return 0; } //a.cpp #包括 使用名称空间std; int main(){ au

我在尝试元组时遇到了创建元组的问题。 代码示例如下所示

//a.cpp
#include <tuple>
using namespace std;

int main() {
  auto te = make_tuple();    //this line is ok
  auto tte = make_tuple(te); //this line gives an error.
  return 0;
}
//a.cpp
#包括
使用名称空间std;
int main(){
auto te=make_tuple();//这行没问题
auto tte=make_tuple(te);//此行给出一个错误。
返回0;
}
我用g++4.5(g++-std=c++0x a.cpp)和MS VC++2010编译了它。 两个编译器都在main()的第二行给了我一个错误

我的问题是: 既然“te”是一个定义良好的变量,为什么不能用te作为内容创建另一个元组呢。这个语义正确吗

我猜这是一种边界情况,但如果算术正确,应该允许零,IMHO

仅供参考,gcc发出的错误消息为:

$ gcc -std=c++0x a.cpp

In file included from a.cpp:1:0:
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/include/c++/tuple: In constructor
  'std::tuple<_Elements>::tuple(std::tuple<_UElements ...>&) [with _UElements = {},
  _Elements = {std::tuple<>}]':

c:\mingw\bin\../lib/gcc/mingw32/4.5.2/include/c++/tuple:551:62:   instantiated from
  'std::tuple<typename std::__decay_and_strip<_Elements>::__type ...> 
  std::make_tuple(_Elements&& ...) [with _Elements = {std::tuple<>&}, typename
  std::__decay_and_strip<_Elements>::__type = <type error>]'
a.cpp:6:27:   instantiated from here

c:\mingw\bin\../lib/gcc/mingw32/4.5.2/include/c++/tuple:259:70: error: invalid
  static_cast from type 'std::tuple<>' to type 'const std::_Tuple_impl<0u>&'
$gcc-std=c++0x a.cpp
在a.cpp中包含的文件中:1:0:
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/include/c++/tuple:在构造函数中
'std::tuple::tuple(std::tuple&)[带{ueelements={},
_元素={std::tuple}]':
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/include/c++/tuple:551:62:从
'std::tuple
std::make_tuple(_Elements&&…[带_Elements={std::tuple&},typename
std::uuu衰变和_u条带::uuu类型=]'
a、 cpp:6:27:从此处实例化
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/include/c++/tuple:259:70:错误:无效
静态\u从类型“std::tuple”转换为类型“const std::\u tuple\u impl&”

这看起来编译器已经将您的
std::tuple
与以下
std::tuple
的构造函数进行了匹配(请参见N3242中的20.4.2p15-17):

模板元组(const-tuple&u)

要求:
sizeof…(类型)==sizeof…(UTypes)
是可构造的::value
对所有
i
都是真的

影响: 用 u的对应元素

备注:本建造商不得 参与解决过载问题 除非
常量Ui&
是隐式的 可转换为适用于所有
i
Ti


我认为这是编译器实现
std::tuple
时的一个bug;“备注”意味着不应考虑此构造函数,因为它不会编译。

对我来说是个bug。:-)从这些消息来看,元组的构造函数似乎试图访问从元组内部复制的数据。但是tuple可能没有!你可以用libcxx试一下,这当然是一个边缘案例,但对于模板代码的互操作性来说,这很有趣。它似乎也用gcc 4.6编译-升级时间到了吗?博:谢谢,我在gcc bugzilla上提交了一个bug,它被确认为gcc4.5.2。执行问题。有没有为mingw提供一个好的gcc4.6二进制发行版的想法?我试过了,但没有找到,不幸的是,我被绑定到windows。是的,这被确认为gcc 4.5.2错误,它与复制构造函数有关,正如我被告知的,gcc团队已在4.6.0中更正了它。我想这就是所谓的最前沿:)