Visual Studio 使用默认关键字时 C2580
Visual Studio C2580 when using default keyword
对于以下代码:
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;
}
我收到一条错误消息:
Error C2580 'S::S(void)': multiple versions of a defaulted special
member functions are not allowed
我不明白。我认为错误是由模板化构造函数引起的(通过注释掉并编译程序验证了这一点)。
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;
}
对于以下代码:
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;
}
我收到一条错误消息:
Error C2580 'S::S(void)': multiple versions of a defaulted special member functions are not allowed
我不明白。我认为错误是由模板化构造函数引起的(通过注释掉并编译程序验证了这一点)。
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;
}