我試圖掌握容器類的 (C 20) 標準要求的細節,以期撰寫一些與標準庫兼容的容器類。開始尋找到這件事情我已經看過了參考的命名要求,特別是圍繞容器的要求,只找到一個普通容器的要求稱為Container由標準給出。閱讀這個要求給了我兩個我不確定的問題,我想澄清一下:
a == b兩種容器型別的運算式的要求以C元素型別為前提,T即它是相等的。但是,稍后在同一頁面的標題“其他要求”下指出的T是始終具有可比性的明確要求。因此,在我的閱讀中,上述要求的前提是多余的,不需要給出。我的這種想法是正確的,還是我應該考慮其他一些事情?我很驚訝地看到明確的要求
T:特別是上面的平等可比要求和可破壞的命名要求。這是否意味著構建不符合這些要求的型別的標準容器或僅對它們執行某些標準庫函式呼叫是未定義的行為?
抱歉,如果這兩個問題聽起來很愚蠢,我目前正試圖將我的 C 知識從對如何使用功能的基本理解轉變為對強大的理解,以便我可以撰寫良好的通用代碼。雖然我正在嘗試使用(草案)標準來查找可能的行為,但它的措辭過于冗長,我無法完全理解實際所說的內容。
編輯。為了尋求答案,我.cpp撰寫了一個快速測驗檔案來嘗試編譯,如下所示。所有未注釋的代碼都使用設定為 C 20 的 MSVC 編譯器進行編譯。所有注釋的代碼都不會編譯,反之,所有未注釋的代碼都會編譯。似乎天真地認為應該起作用的東西特別是:
- 我們不能在沒有解構式的情況下構造任何物件,盡管物件型別是有效的并且可以用于其他事情(例如作為模板引數!)
- 即使我們不嘗試創建任何物件
vector<T>,我們也無法創建T沒有解構式的 物件T。大概是因為創建解構式 forvector<T>嘗試訪問T. - 我們可以創建一個型別的物件
vector<T>,T其中T沒有運算子==,只要我們不嘗試使用運算子==,這將需要T有運算子==。
然而,僅僅因為我的編譯器可以讓我做的一個目的vector<T>,其中T是不是平等的,可比的,并不意味著我已經實作符合標準的行為/我們所有的行為是不是未定義-這是我想要什么,我關心的問題,尤其是至少一些違反了對容器物件的通常要求。
代碼:
#include<vector>
#include<iostream>
//A basic class with its == operator removed
class MyNonEqualityComparableClass
{
//Destroy any possible == operator, for good measure
template<typename T>
auto operator==(T&& t) = delete;
public:
//Give the test struct a value so we mute the class and check
bool Mytestvalue = true;
};
class MyNonDestructableClass
{
~MyNonDestructableClass() = delete;
};
// A basic class template with no functionality added
template<typename T>
class MyTemplateClass
{};
int main()
{
//1. Non-destructable Class Test.
{
//Compiler Grumbles if uncommented, no destructor is inaccessable for the class
//MyNonDestructableClass a, b;
//Class Dependent On my Nondestructable Class
MyTemplateClass < MyNonDestructableClass> mtc;
//Compiler Grumbles if uncommented, as class tries to acceess the inacessable destructor of MyNonDestructableClass
//auto u = std::vector< MyNonDestructableClass>();
}
//2. Non-Equality-Comparable Class Test.
{
MyNonEqualityComparableClass x, y;
//Compiler Grumbles if uncommented
//x == y;
//Compiler Fine with below
auto u = std::vector<MyNonEqualityComparableClass>();
auto v = std::vector<MyNonEqualityComparableClass>();
u.push_back(x);
v.push_back(y);
x.Mytestvalue = !x.Mytestvalue;
//Compiler Grumbles if uncommented
//u == v;
std::cout << "The value of x.Mytestvalue is: \t" << std::boolalpha << x.Mytestvalue << std::endl;
}
}
我的輸出:
The value of x.Mytestvalue is: false
uj5u.com熱心網友回復:
如果容器的成員不可破壞,那么除了添加新元素(或替換現有元素)之外,容器永遠不會做任何事情。erase,resize和破壞都涉及破壞元素。如果您有一個T不可破壞的型別,并試圖實體化一個vector<T>(比如說),我預計它會無法編譯。
至于重復的要求,我懷疑這只是 CppReference 人員撰寫該頁面時偷偷摸摸的東西。標準中的容器要求(在 for 的條目中a == b)提到元素必須具有相等可比性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/397872.html
