使用默认关键字时Visual Studio C2580

时间:2016-05-13 06:12:44

标签: c++ templates c++11 visual-c++ defaulted-functions

以下代码:

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&#39; S :: S(无效)&#39;:默认特殊版的多个版本   不允许使用成员函数

我不明白。我认为错误是由模板化的构造函数引起的(通过注释并编译程序验证了这一点。)

1 个答案:

答案 0 :(得分: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;
}