Visual Studio C2580 при использовании ключевого слова по умолчанию

Для следующего кода:

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)’: несколько версий специального значения по умолчанию
функции-члены не допускаются

Что я не понимаю Я думаю, что ошибка вызвана шаблонным конструктором (проверил это, закомментировав его и скомпилировав программу).

2

Решение

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]