考慮下面的代碼片段...initializer_list <T>不能轉換爲initializer_list <U>,而T3可轉換至U
void boo(std::initializer_list<unsigned> l)
{
}
template <class T>
void foo(std::initializer_list<T> l)
{
//Even though T is convertable, initializer list is not...:-(
boo(move(l));
}
int main()
{
foo({1u,2u,3u}); //Compiles fine as expected
foo({1,2,3}); //Fails to compile at line 9... - could not convert...
return 0;
}
...我很驚訝,initializer_list<int>
是無法轉換爲initializer_list<unsigned>
,雖然事件int轉換爲無符號。
我一直想知道用什麼方法可以寫出foo來允許轉換。能以某種方式解開具有錯誤類型的列表並重新創建具有正確類型的新列表嗎?
@WernerErasmus不知道我明白你正在談論的'std :: shared_ptr'轉換... – vsoftco
我的歉意。我錯了 - 我與正常派生的基礎轉換混淆。 –
@WernerErasmus哦,是的,這是一個不同的故事,在這種情況下'T'仍然被推斷爲'Base *',但是在內部''shared_ptr'可以使用'Base *'來訪問'Derived'的虛擬接口。 – vsoftco