类模板中的常规复制构造函数不能默认吗?

Can not general copy constructor in class template be defaulted?

提问人:Fedor 提问时间:5/23/2022 更新时间:5/23/2022 访问量:170

问:

在下面的程序中,struct template 有一个来自 的构造函数。因为它应该是 copy-constructor,可以默认为:Aconst A<int> &A<int>

template<typename T>
struct A {
    A() {}
    A(const A<int> &) = default;
};

int main() {
    A<int> a;
}

此程序被 Clang 接受,但 GCC 和 MSVC 都拒绝它并显示错误:

 error C2610: 'A<T>::A(const A<int> &)': is not a special member function or comparison operator which can be defaulted
note: see reference to class template instantiation 'A<T>' being compiled

演示:https://gcc.godbolt.org/z/Mn6nMbe1x

哪个编译器就在这里?

C++ 模板 language-lawyer 复制构造函数 default-constructor

评论

6赞 Some programmer dude 5/23/2022
该构造函数不是复制构造函数,而是转换构造函数,它允许从 转换为 。A<int>A<T>
0赞 Constantinos Glynos 5/23/2022
@Someprogrammerdude:我认为,因为 ,clang 认为这是抄袭。您也可以通过添加 来查看这一点。我认为 clang 在这里是错误的......但不确定。const &A(A<int> &&) = default;
1赞 Ch3steR 5/23/2022
将这三个相加会产生相同的错误。我的猜测是以某种方式被欺骗了,以为是复制者。A<float> a;A<int> a;A(const A<int> &) = default;
0赞 Constantinos Glynos 5/23/2022
嗯。。。也许 Clang 没有检查每个 CTOR 中的类型。因为不需要在 ctor 中指定 typename,即 和 一样,Clang 可能已经跳过了这个检查。很有意思。<>A(const A &)A(const A<T> &
0赞 Language Lawyer 5/23/2022
timsong-cpp.github.io/cppwp/n4861/temp.res#8.4 和/或 timsong-cpp.github.io/cppwp/n4861/temp.res#8.5 可以在这里使用吗?

答: 暂无答案