Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

Appendix A. Rationale for some of the design decisions(某些設計權衡的根本原因)

Table of Contents

Lambda functor arity(lambda 仿函數數量)

Lambda functor arity(lambda 仿函數數量)

一個 lambda 表達式中的最高佔位符索引決定最終的函數對象的數量。但是,這只是一個最小數量,因為函數對象可以持有任意多的參數,那些不需要被放棄。考慮下面的兩個 bind 表達式和它們的調用:

bind(g, _3, _3, _3)(x, y, z); 
bind(g, _1, _1, _1)(x, y, z);

第一行放棄參數 xy,做成這樣的調用:

g(z, z, z) 

第二行放棄參數 yz,調用:

g(x, x, x)

在庫的早期版本中,後一行將導致一個編譯時錯誤。這主要是安全性和靈活性之間的一個折衷,而且這個問題在 Boost 庫的評審期間引起廣泛討論。strict arity(強數量)檢查的主要觀點在於它可以盡早捕捉到一個編程錯誤,而且一個 lambda 表達式顯式放棄它的參數也很容易:

(_3, bind(g, _1, _1, _1))(x, y, z);

這個 lambda 表達式持有三個參數。逗號操作符的左側參數什麼也不做,逗號返回右側參數的求值結果,這樣我們就在強數量檢查的情況下調用了 g(x, x, x)

反對強數量檢查的主要觀點在於需要放棄參數是很平常的事情,因此應該是直截了當的,而且強數量檢查也沒有真正換取多少安全性,特別是它不是對稱的。例如,如果程序員想要寫表達式 _1 + _2,但是錯寫成 _1 + 2,如果有強數量檢查,編譯器會發現這個錯誤。但是,如果錯誤表達式是 1 + _2,這個錯誤就不會被注意。此外,弱數量檢查的實現更簡單。根據 Boost 審查的建議,強數量檢查被去掉了。

Copyright 1999-2004 Jaakko Jrvi, Gary Powell

PrevUpHomeNext