[英]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.