簡體   English   中英

STL容器賦值和const指針

[英]STL container assignment and const pointers

這編譯:

int* p1;
const int* p2;
p2 = p1;

這不是:

vector<int*> v1;
vector<const int*> v2;
v2 = v1;  // Error!
v2 = static_cast<vector<const int*> >(v1);  // Error!

嵌套const指針的類型等價規則是什么? 我認為轉換是隱含的。 此外,除非我真的需要,否則我寧願不實現STL容器的逐點分配。

無法直接分配。 正如其他人所解釋的那樣,等價不是由指針類型建立的,而是由容器類型建立的。 在這種情況下,vector不希望接受具有不同但兼容的元素類型的另一個向量。

沒問題,因為您可以使用assign成員函數:

v2.assign(v1.begin(), v1.end());

int*const int*轉換內置在語言中,但是這些的向量沒有從一個到另一個的自動轉換。

問題不是指針,而是兩個向量的類型。 在您的示例中,模板化類型(如v1和v2的類型)之間沒有標准轉換。

在以下代碼中可能更容易看到:

#include <vector>
using namespace std;

int main() {
    vector <char> cv;
    vector <int> iv;
    cv = iv;    // error
}

在C ++模板化的類中,模板的每個實例化都是一個完全不同的類 - vector<int *>vector<const int *>之間存在着很大的差異,因為vector<int *>vector<string>之間存在任何差異。其他兩個類就此而言。

委員會可能已經在vector vector<U>上添加了一個轉換運算符,正如Earwicker所建議的那樣 - 你可以繼續提供你自己的這樣一個函數的實現:

template <class A, class T>
vector<T> convert_vector(const vector<A> &other)
{
    vector<T> newVector;
    newVector.assign(other.begin(), other.end());
    return newVector;
}

並像這樣使用它:

vector<int*> v1;
vector<const int*> v2;
v2 = convert_vector<const int*>(v1);

不幸的是,在C ++ 0x附帶它的移動構造函數之前,這將是非常糟糕的性能。

在可能的情況下編寫自己的vector版本是完全可能的。 它與標准類型相同,但是帶有operator=的模板化版本,如下所示:

template <class A>
vector2<T> &operator=(const vector2<A> &other)
{
    assign(other.begin(), other.end());
    return *this;
}

其中T是整個類的元素類型,而A是可賦予T的任何類型。

我不清楚為什么std::vector沒有這個。

危險,除非您知道類型絕對兼容:

v2 = reinterpret_cast<std::vector<const int *> & >(v1);

大多數STL實現都使用專門化,所有指針向量都共享相同的底層實現。 這是因為(void *)通常與(int *)或任何其他指針類型的大小相同。

在任何先前的答案中沒有提到的重要一點是,模板專業化使得在語言范圍內無法實現這一點。 考慮:

template<class T>
class Test
{
    T t;
};

template<>
class Test<const int>
{
    char array[1000];
};

因此, Test<const int>包含一個chars數組,而Test<int>包含一個int。

#include <iostream>
using namespace std;

int main()
{
    Test<int> t1;
    Test<const int> t2;
    cout << sizeof(t1) << endl; // gives 4
    cout << sizeof(t2) << endl; // gives 1000
    return 0;
}

實際上, vector<foo *>vector<const foo *>可能幾乎沒有差別 - 特別是,它們可能具有相同的大小。 但是,顯式模板特化的可能性意味着它們可能會有很大差異,因此編譯器不願意允許轉換。

(這個答案主要是從http://bytes.com/topic/c/answers/449611-cast-vector-foo-vector-const-foo#post1717570復制而來)

成員強制模板習慣用法是解決問題的一種可能方法。 實質上,添加了一個成員模板復制賦值運算符,它允許模板類參與相同的隱式類型轉換(強制),否則只能在類模板的類型參數上進行。 雖然這個習慣用法在其他地方的STL中使用,但它在std :: vector中不可用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM