從C 11開始,std::allocator定義了三個建構式,大致相當于下面這個類的建構式:
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是必須的嗎?編譯器如何知道要為第三個建構式提供一個默認的實作呢?
uj5u.com熱心網友回復:
這個模板構造器
template<typename U>
constexpr allocator(const allocator<U> &other) noexcept{};
不是復制建構式。
復制建構式是一個類的非模板成員函式。
這個模板建構式是一個非模板成員函式。
當std::is_same_v<T, U>等于false時,這個模板建構式被選中。
uj5u.com熱心網友回復:
它[第三個建構式]在技術上似乎是復制建構式的特化?
它根本就不是一個復制建構式。 它實際上是一個轉換建構式,而不是
。第二個建構式是否會被呼叫?
如果一個allocator<T>物件被用來構造另一個allocator<T>物件,那么第二個建構式將被使用,是的。例如:
allocator<int> a1。
allocator<int> a2(a1);
但是,如果一個不同的allocator<U>物件被用來構造一個allocator<T>物件,其中U與T不是同一型別,那么就會使用第三個建構式。 例如:
allocator<short> a1。
allocator<int> a2(a1)。
= default是否需要?
只有當你希望編譯器自動生成一個實作時才需要。 否則,你必須自己提供一個。
編譯器如何知道要為第三個建構式提供一個默認的實作呢?
建構式正文中{}之間的所有內容都是用戶定義的。 如果沒有{},那么你需要使用= default(或= delete)來代替。
在非洗掉建構式中,編譯器總是default-initializes每個類成員,除非在建構式的成員初始化串列中另有規定 - 第3個建構式沒有。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/316129.html
標籤:
