【发布时间】:2021-09-10 17:00:57
【问题描述】:
这与my previous question 密切相关,但我认为它足够不同,值得再发一篇。
这是我所引用的歧义的一种相当纯粹的形式:
template<typename T>
class Class {
public:
Class() = default;
template<typename U>
Class(Class<U> &) {}
};
这个类有两个值得注意的潜在冲突构造函数:隐式复制构造函数和重新绑定构造函数模板。举个例子:
Class<int> foo{};
Class<int> bar{foo};
在这种情况下,重新绑定构造函数模板的解析类型将是 Class<int>(Class<int> &) - 与隐式复制构造函数相同的签名!
C++ 标准是指定哪个构造函数优先,还是由实现定义?
作为附录,特殊成员函数(如复制构造函数)在这些场景中是否受到特殊处理?即,场景会
template<typename T>
class Vector {
public:
T x, y;
Vector foo(Vector &other) {
...
}
template<typename U>
Vector foo(Vector<U> &other) {
...
}
};
...
Vector<int> vec1{1, 2};
Vector<int> vec2{3, 4};
auto fooVec = vec1.foo(vec2);
表现与第一个示例不同?
【问题讨论】:
标签: c++