2015-06-13 15 views
10

C++ 17 fold expressions bir göz alıyorum ve aşağıdaki program çıktıları for_each aramaların ikisi içinSol kattaki bir ifade, doğru katlama ifadesinin çıktısını neden ters çevirmiyor?

4 5 6 
4 5 6 

neden yaptığını merak ediyorum

template<typename F, typename... T> 
void for_each1(F fun, T&&... args) 
{ 
    (fun (std::forward<T>(args)), ...); 
} 

template<typename F, typename... T> 
void for_each2(F fun, T&&... args) 
{ 
    (..., fun (std::forward<T>(args))); 
} 

int main() 
{ 
    for_each1([](auto i) { std::cout << i << std::endl; }, 4, 5, 6); 
    std::cout << "-" << std::endl; 
    for_each2([](auto i) { std::cout << i << std::endl; }, 4, 5, 6); 
} 

Live Example

İkinci kat ifade ifadesinin, sayıları ters sırayla

olarak belirtmek olduğunu sanmıştım.
6 5 4 

Sonuçlar nasıl aynıdır? ((E 1 op E2) op · ·) op TR -

(9,1):

cevap

9

bir katlama ifade örneğinin üreten 14.5.3/9

§ göre bir tekli sol kat,

(9,2) için - E1 op (· · op (TR-1 op TR)) bir tekli hemen üst için,

(9,3) (((E op E1) op E2) op ikili · sol katlama ve

(9.4) - E1 op (· · op (EN-1 op (EN op E))) bir ikili sağ kıvrım için

Her durumda, katlama işlecidir, N paket genişletme parametrelerindeki öğelerin sayısıdır ve her Ei, kalıbı başlatarak ve her bir paket genişletme parametresini ith öğesi. bunlar tekli katlama ifadeleri ve genişleme hem konum Yukarıdaki kod

comma operator tarafından tayin edilen ve böylece çıkış aynıdır

template<typename F, typename... T> 
void for_each1(F fun, T&&... args) { 

    // Unary right fold (fun(args_0) , (fun(args_1) , (fun(args_2) , ...))) 
    (fun (std::forward<T>(args)), ...); 
} 

template<typename F, typename... T> 
void for_each2(F fun, T&&... args) { 

    // Unary left fold ((fun(args_0) , fun(args_1)) , fun(args_2)) , ... 
    (..., fun (std::forward<T>(args))); 
} 

böylece değer aynı değerlendirme sırasını sahip olan .

Kredi: teşekkürler ilk etapta orijinal soruyu yükseltti ve bana bu potansiyel-yanıltıcı sorunu çözmek için şans verdi arkadaşım Marco için.

İlgili konular