Optimistic76 Ответов: 1

Std::tuple нет подходящего конструктора по умолчанию


Привет,

Если я попытаюсь скомпилировать приведенный ниже пример, то получу ошибку

'std::tuple<long &,int>::tuple': соответствующий конструктор по умолчанию недоступен

Как я могу заставить этот пример работать, чтобы заставить кортеж принимать смешанные значения lvalue ref и rValue?

#include "stdafx.h"
#include <tuple>


template<class ...Arg>
class A
{
	std::tuple<Arg...> tuple_;
public:
	A(Arg&&...args)
	{
		tuple_ = std::make_tuple(std::forward<Arg>(args)...);
		
	}
};

template<class...Arg>
void f(Arg&&...args)
{
	A<Arg...> a(std::forward<Arg>(args)...);
}


int main()
{
    long t = 5;
    f(t,5);
	
    return 0;
}


Что я уже пробовал:

Я попробовал использовать std::make_tuple , std::forward_as_tuple или std::tie, но ничто не заставляет пример компилироваться без ошибок.

1 Ответов

Рейтинг:
4

CPallini

Это работает (по крайней мере, в моей системе) таким образом:

#include <tuple>


template<class ...Arg>
class A
{
  std::tuple<Arg...> tuple_;
public:
  A(Arg&&...args):tuple_(std::forward<Arg>(args)...)
  {
  }
};

template<class...Arg>
void f(Arg&&...args)
{
  A<Arg...> a(std::forward<Arg>(args)...);
}


int main()
{
    long t = 5;
    f(t,5);

    return 0;
}


Я предполагаю (хотя это просто дикая догадка), что причина, по которой такой кортеж ctor является (условно) явным, см. std::tuple<types...>::tuple[^].