2015-08-15 43 views
3

爲什麼std::queue使用std::vector創建容器不會引發編譯器錯誤?爲什麼使用std :: vector容器創建std ::隊列不會引起編譯器錯誤

只有在調用彈出窗口時纔會出現編譯錯誤(這是明確的,因爲矢量不提供pop_front())。

#include <iostream> 
#include <queue> 
#include <vector> 

using namespace std; 

int main() 
{ 
    queue<int, vector<int>> s; 

    s.push(10); 

    cout << s.front() << endl; 

    s.pop(); 

    return 0; 
} 

DEMO

+0

什麼是「非默認的std :: vector」? –

+0

@KerrekSB:意思是std :: vector不是隊列的默認容器(它是std :: deque)。無論如何編輯標題。是更清晰。 – 911

+1

那麼,創作作品。這是'流行',不起作用,所以你在那裏得到錯誤。 –

回答

5

因爲類模板的成員函數將不會被隱式實例化,直到它被調用。

從$ 14.7.1/2隱式實例[temp.inst]:

除非類模板或成員模板的成員已經明確 實例化或明確專門的,該成員的專業化 在需要成員定義存在的上下文中引用專業化爲 時隱式實例化;

和/ 4:

[ Example: 
template<class T> struct Z { 
void f(); 
void g(); 
}; 
void h() { 
Z<int> a; // instantiation of class Z<int> required 
Z<char>* p; // instantiation of class Z<char> not required 
Z<double>* q; // instantiation of class Z<double> not required 
a.f(); // instantiation of Z<int>::f() required 
p->g(); // instantiation of class Z<char> required, and 
// instantiation of Z<char>::g() required 
} 

與/ 11:

一種實現不應隱含地實例化一個函數 模板,變量模板,一個構件模板,非虛擬成員 函數,成員類或不需要實例化的類模板 的靜態數據成員。

+0

我不認爲這解釋了爲什麼不需要診斷,並且如果我正確閱讀了§23.6.3.1/ 1,這似乎意味着診斷*實際上是必需的:「任何支持操作的序列容器...都可以使用實例化'queue'「 - 這是否意味着沒有其他容器可以用來實例化'queue'? –

+0

@KonradRudolph是的,容器必須滿足這些要求,所以不能使用其他*標準容器(儘管你可以自己製作)。這是Concepts在C++ 17(最終)中所做的事情之一。 –

+0

@KonradRudolph如果你不調用'pop()',它不會被實例化,所以沒有人試圖在'vector'上調用一個不存在的'pop_front()'。所以這取決於你的使用情況。 – songyuanyao

相關問題