参数类型为 `const T &` 和类型为 `const T<U> &` 的复制构造函数之间有区别吗?
Is there a difference between a copy constructor with an argument type of `const T &` and of type `const T<U> &`?
从 C++11 开始,std::allocator
定义了三个构造函数,大致等同于以下 class:
template<typename T>
class allocator {
public:
constexpr allocator() noexcept = default;
constexpr allocator(const allocator &other) noexcept = default;
template<typename U>
constexpr allocator(const allocator<U> &other) noexcept {};
};
第一个是默认构造函数,第二个是复制构造函数 - 非常标准的东西。然而,第三个构造函数让我很困惑。它在技术上似乎是复制构造函数的专业化?如果是这样的话,第二个构造函数甚至会被调用吗? = default
是必需的吗?编译器如何知道为第三个构造函数提供默认实现?
这个模板构造器
template<typename U>
constexpr allocator(const allocator<U> &other) noexcept {};
不是复制构造函数。
复制构造函数是class的非模板成员函数。
当std::is_same_v<T, U>
等于false时选择此模板构造器。
It [the third constructor] appears to technically be a specialization of the copy constructor?
根本就不是拷贝构造函数。它实际上是 converting constructor 而不是。
would the second constructor ever even be called?
如果一个allocator<T>
对象被用来构造另一个allocator<T>
对象,那么会使用第二个构造函数,是的。例如:
allocator<int> a1;
allocator<int> a2(a1);
但是,如果使用不同的allocator<U>
对象构造allocator<T>
对象,其中U
与T
不是同一类型,那么第三个构造函数将会被使用。例如:
allocator<short> a1;
allocator<int> a2(a1);
Is = default
required?
仅当您希望编译器自动生成实现时。否则,您必须自己提供一个。
How does the compiler know to provide a default implementation for the third constructor?
构造函数主体中 {}
之间的所有内容都是用户定义的。如果没有 {}
则需要使用 = default
(或 = delete
)代替。
在未删除的构造函数中,编译器总是default-initializes each class member, unless specified otherwise in the constructor's member initialization list——第三个构造函数没有。
从 C++11 开始,std::allocator
定义了三个构造函数,大致等同于以下 class:
template<typename T>
class allocator {
public:
constexpr allocator() noexcept = default;
constexpr allocator(const allocator &other) noexcept = default;
template<typename U>
constexpr allocator(const allocator<U> &other) noexcept {};
};
第一个是默认构造函数,第二个是复制构造函数 - 非常标准的东西。然而,第三个构造函数让我很困惑。它在技术上似乎是复制构造函数的专业化?如果是这样的话,第二个构造函数甚至会被调用吗? = default
是必需的吗?编译器如何知道为第三个构造函数提供默认实现?
这个模板构造器
template<typename U>
constexpr allocator(const allocator<U> &other) noexcept {};
不是复制构造函数。
复制构造函数是class的非模板成员函数。
当std::is_same_v<T, U>
等于false时选择此模板构造器。
It [the third constructor] appears to technically be a specialization of the copy constructor?
根本就不是拷贝构造函数。它实际上是 converting constructor 而不是。
would the second constructor ever even be called?
如果一个allocator<T>
对象被用来构造另一个allocator<T>
对象,那么会使用第二个构造函数,是的。例如:
allocator<int> a1;
allocator<int> a2(a1);
但是,如果使用不同的allocator<U>
对象构造allocator<T>
对象,其中U
与T
不是同一类型,那么第三个构造函数将会被使用。例如:
allocator<short> a1;
allocator<int> a2(a1);
Is
= default
required?
仅当您希望编译器自动生成实现时。否则,您必须自己提供一个。
How does the compiler know to provide a default implementation for the third constructor?
构造函数主体中 {}
之间的所有内容都是用户定义的。如果没有 {}
则需要使用 = default
(或 = delete
)代替。
在未删除的构造函数中,编译器总是default-initializes each class member, unless specified otherwise in the constructor's member initialization list——第三个构造函数没有。