Для следующего кода:
struct S
{
S() = default;
S(S const&) = default;
S(S&&) = default;
S& operator=(S const& other) = default;
S& operator=(S&&) = default;
template <typename... T>
S(T&&... params)
{
}
};
int main()
{
S s;
return 0;
}
Я получаю сообщение об ошибке:
Ошибка C2580 ‘S :: S (void)’: несколько версий специального значения по умолчанию
функции-члены не допускаются
Что я не понимаю Я думаю, что ошибка вызвана шаблонным конструктором (проверил это, закомментировав его и скомпилировав программу).
template <typename... T>
S(T&&... params)
{
}
T может быть пустым, оставляя вас с конструктором по умолчанию, это может быть S&&
оставив вас с конструктором перемещения, или это может быть const S &
оставив вас с конструктором копирования.
Но вы только что сказали компилятору, что вам нужна их версия по умолчанию, так что это сбивает с толку, потому что вы просто дали ей четкое определение для каждого из них.
Я хотел бы предложить следующее в качестве решения, так как только конструктор по умолчанию вызывает проблему, но этот код вызывает сбой компилятора:
struct S
{
S() = default;
S(S const&) = default;
S(S&&) = default;
S& operator=(S const& other) = default;
S& operator=(S&&) = default;
template <typename S, typename... T>
S(S&& s, T&&... params)
{
}
};
int main()
{
S s;
return 0;
}
Других решений пока нет …