2

对于以下代码:

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)':不允许使用多个版本的默认特殊成员函数

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

4

1 回答 1

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;
}
于 2016-05-13T06:35:55.657 回答