使用默认关键字时使用Visual Studio C2580

Visual Studio C2580 when using default keyword

本文关键字:Studio C2580 Visual 关键字 默认      更新时间:2023-10-16

对于以下代码:

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