2015-10-19 27 views
4

我玩弄可變參數模板,寫了這樣的基礎上,this answer明確運營商<<選擇「錯」過載

template <size_t... I> 
void print(seq<I...>) 
{ 
    decltype(std::cout) * dummy[sizeof...(I)] = { &(std::cout << I << ' ')... }; 
} 

因爲std::cout::operator<<有一個返回類型,它可以存儲,所以有不需要(,0)逗號技巧。

現在,閉嘴「未使用變量‘虛擬’」警告,並打印一個換行符,我嘗試了下面的語句,但他們沒有做什麼,我想:

dummy[0]->operator <<('\n'); // prints 10 

(顯然稱爲operator<<(int)代替operator<<(char)

dummy[0]->operator <<("\n"); // prints a pointer 

(顯然稱爲operator<<(const void*)代替operator<<(const char*)

在我必須寫

*dummy[0] << '\n';    // prints a newline as desired 

我的問題是,爲什麼「錯誤」的重載被選中?

+2

什麼'std :: cout << std :: is_same :: value <<'\ n';'print? – Yakk

回答

9

選擇了「錯誤的」過載,因爲only some overloadsstd::ostream類的成員。爲charconst char*重載不是的std::ostream,但free functions成員,因此,在

*dummy[0] << '\n'; 

參數相關的查找會發現operator<<(std::ostream&, char),但在

dummy[0]->operator <<('\n'); 

僅成員函數將被認爲是,所得的在std::ostream::operator<<(int)被調用。