|
|
1
2
特殊成员函数(复制/移动)通过其签名进行标识。当您试图对它们进行模板化时,您正在用定义模板 另一个 签名,因为模板参数是模板签名的一部分,而该函数与您试图禁止的复制/移动对象无关。 为了完整起见,引用标准,强调我的:
在描述其他特别成员时也会出现类似的措辞。它们必须是非模板。 所以您不会用sfinae影响这些函数。你不能用sfinae直接影响它们,因为编译器确保它们总是存在的。影响它们生成或缺少它们的唯一方法是从基类继承(有条件地,甚至是继承),或者拥有成员数据,这将导致它们被定义为已删除。
假设两年内没有发生任何变化,在C++ 20中有可能将复制构造函数(或任何特殊成员)约束为
|
|
|
2
2
建议的解决方法(如果我正确理解了需求)是将复制/移动功能和同步推迟到基类(如果需要,可以是mixin):
第一条评论中的问题解答:
将移动/复制功能延迟到基类的原因是,我们希望完全从
是的
如果您没有在派生类中定义特殊的构造函数/析构函数(我们故意没有这样做),并且我们在派生类中没有定义数据对象,那么它与将复制/移动构造函数规则延迟到基类具有相同的效果。这不是完全正确的描述,但实际上发生了什么。
在这种情况下,是的。
在这种情况下是有效的。 记住要定义基类中的所有数据对象。 |