Не может создать унарный кортеж с пустым кортежем в нем (С++ 0x)

Я экспериментировал с кортежами и столкнулся с проблемой создания кортежей. Пример кода выглядит следующим образом.

//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;
}

Я скомпилировал его как с g++ 4.5 (g++ -std = С++ 0x a.cpp), так и с MS VС++ 2010. Оба компилятора дают мне ошибку во второй строке в main().

Мой вопрос таков: Поскольку "te" - это четко определенная переменная, почему нельзя создать другой кортеж с тем, что te является содержимым. Правильно ли это семантично?

Я предполагаю, что это своего рода граничный случай, но если арифметика правильная, нуль должен быть разрешен, ИМХО.

FYI, сообщение об ошибке из 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>&'

Ответ 1

Похоже, что компилятор сопоставил ваш std::tuple<> со следующим конструктором std::tuple<std::tuple<>> (см. 20.4.2p15-17 в N3242):

template <class... UTypes> tuple(const tuple<UTypes...>& u);

Требуется: sizeof...(Types) == sizeof...(UTypes). is_constructible<Ti , const Ui &>::value истинно для всех i.

Эффекты: Создает каждый элемент *this с помощью соответствующий элемент и.

Примечание. Этот конструктор не должен участвовать в разрешении перегрузки если const Ui & неявно конвертируется в Ti для всех i.

Я думаю, что это ошибка в реализации std::tuple из вашего компилятора; "замечание" подразумевает, что этот конструктор не следует рассматривать, поскольку он не будет компилироваться.