2015-10-16 30 views
-1

我有一個關於編譯器/語言行爲的問題,我期望其行爲有所不同。 爲什麼下面的代碼會被編譯?構造函數中具有空std :: vector的意外編譯器行爲

#include <vector> 
class A { }; 
int main() { 
    A a(std::vector<int>()); 
} 

它不能用std::vector<int>(0)或其他值編譯。不過,如果您給std::vector<int>(*)一個指針,它會進行編譯。它也適用於除「int」之外的其他類型。我希望代碼根本不起作用。有人可以向我解釋發生了什麼?

這裏是剪斷上cpp.sh參考代碼:http://cpp.sh/4l3a

我用gcc版本4.8.4。

+0

因爲它_does_編譯,你應該假設它應該,而且我們不能猜測你爲什麼認爲它不應該。 _你有什麼期望?_ –

+0

抱歉,重複的答案。 @LightnessRacesinOrbit在他的回答中正確地承擔了我的期望。 – Squolly

回答

2

我認爲你期望它編譯失敗,因爲A沒有構造函數接受向量。但是,這並不是A的聲明。它是一個稱爲a的函數的聲明,將一個指針(無名字)帶給返回std::vector<int>的函數,並返回A

當你把它改成這樣:

A a(std::vector<int>(0)); 

使用一個整數文字的力量解析器認識到這一點作爲一個對象實例化,而不是,這當然失敗的原因A沒有構造服用載體。

您可以強制解析器的認可,你的第一個情況下,也使用額外的括號:

A a((std::vector<int>())); 

這是most vexing parse的一個實例。

+0

你說得對。我認爲它不應該工作,因爲在std :: vector中沒有定義在A中的構造函數。非常感謝您的回答。這對我幫助很大!我學到了一些關於這門語言的新東西。通過搜索找不到任何內容我不知道要搜索什麼。 – Squolly

+0

@Angew:謝謝你澄清這一點 – Squolly

相關問題