【发布时间】:2016-09-09 04:52:30
【问题描述】:
对于以下代码:
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)':默认特殊的多个版本 不允许使用成员函数
我不明白。我认为该错误是由模板化构造函数引起的(通过将其注释掉并编译程序来验证这一点)。
【问题讨论】:
-
我猜
S(S&&);应该有自定义实现。因为这是您窃取传递给它的参数的内存区域(即数据)的函数。否则它将与S(S const&);相同,同样适用于operator= -
一个
main()实际练习到你的编译错误点将使这个问题更加健壮。也许更新问题。 -
您的模板化构造函数可以与您的任何默认构造函数相同,因此编译器不知道您想要做什么。它可以是默认、复制或移动构造函数。你说你希望它默认,但你也提供了一个自定义实现。
-
@xaxxon 当两个或多个构造函数匹配得一样好时,在重载决议中首选非模板
-
@PiotrSkotnicki 这似乎是一个更具体的错误。另外,这是我们所说的 VS,所以标准并不意味着太多。
标签: c++ templates c++11 visual-c++ defaulted-functions