2016-08-29 58 views
2

我正在學習新的C++ 17倍表達式,我從c++17 fold expression中看到了這段代碼。我想知道爲什麼此代碼的工作:C++在cout中17倍表達式

template<typename ...Args> 
void printer(Args&&... args) { 
    (std::cout << ... << args) << '\n'; 
} 

,但不是這一個:

template<typename ...Args> 
void printer(Args&&... args) { 
    (std::cout << args << ...) << '\n'; 
} 

這可能顯得過於邏輯和將扭轉在我看來,打印順序。

+0

'std :: cout << ... << args'匹配(4)'init op ... op pack'。 'std :: cout << args << ...'不匹配任何有效的表單。 – Michael

+0

爲什麼人們選擇不創建這種形式?那麼我們如何才能以相反的方式獲得參數呢? –

+0

「*那我們怎麼才能以相反的方式得到參數呢?*」你必須寫一些反轉工具,這很難寫。正常的包裝展開無法以相反的順序展開包裝。 –

回答

7

如所看到的上cppreference,二進制褶皺可以有以下兩種形式:

Screenshot from cppreference/fold

E包表達I初始化表達式


沒有二進制倍,你(std::cout << args << ...),其中有(I op E op ...)形式相匹配。