Call-by-value และ call-by-reference เป็นเทคนิคการใช้งานที่ผิดพลาดสำหรับโหมดผ่านพารามิเตอร์เมื่อนานมาแล้ว
ในตอนแรกมีฟอร์แทรน FORTRAN มีเพียงการโทรโดยการอ้างอิงเนื่องจากรูทีนย่อยต้องสามารถแก้ไขพารามิเตอร์ของตนและรอบการคำนวณมีราคาแพงเกินไปที่จะอนุญาตให้ใช้โหมดการส่งผ่านพารามิเตอร์หลายตัว
ALGOL เกิดขึ้นกับ call-by-name และ call-by-value Call-by-value ใช้สำหรับสิ่งที่ไม่ควรเปลี่ยน (พารามิเตอร์อินพุต) การโทรตามชื่อใช้สำหรับพารามิเตอร์เอาต์พุต การโทรตามชื่อกลายเป็นเรื่องสำคัญมากและ ALGOL 68 ก็ทำเช่นนั้น
PASCAL จัดเตรียมการเรียกใช้โดยค่าและการอ้างอิงโดยการเรียก มันไม่มีวิธีการใด ๆ ที่โปรแกรมเมอร์จะบอกคอมไพเลอร์ว่าเขาผ่านวัตถุขนาดใหญ่ (โดยปกติคืออาร์เรย์) โดยการอ้างอิงเพื่อหลีกเลี่ยงการเป่าพารามิเตอร์สแต็ก แต่ไม่ควรเปลี่ยนวัตถุ
PASCAL เพิ่มตัวชี้ไปยังพจนานุกรมการออกแบบภาษา
C จัดเตรียมการเรียกใช้โดยค่าและจำลองการโทรโดยอ้างอิงโดยการกำหนดตัวดำเนินการ kludge เพื่อส่งคืนตัวชี้ไปยังวัตถุที่กำหนดเองในหน่วยความจำ
ภาษาต่อมาคัดลอก C ส่วนใหญ่เป็นเพราะนักออกแบบไม่เคยเห็นอะไรเลย นี่อาจเป็นสาเหตุที่ค่าโทรโดยค่านิยมมาก
C ++ เพิ่ม kludge ที่ด้านบนของ C kludge เพื่อให้การโทรโดยอ้างอิง
ตอนนี้เป็นผลโดยตรงของการโทรโดยค่าเทียบกับการโทรโดยการอ้างอิงกับการโทรโดยตัวชี้ kludge, C และ C ++ (โปรแกรมเมอร์) มีอาการปวดหัวที่น่ากลัวกับตัวชี้ const และตัวชี้ไปยัง const (อ่านอย่างเดียว) วัตถุ
Ada พยายามหลีกเลี่ยงฝันร้ายทั้งหมดนี้
Ada ไม่มี call-by-value และ call-by-reference อย่างชัดเจน ค่อนข้าง Ada มีพารามิเตอร์ (ซึ่งอาจจะอ่าน แต่ไม่ได้เขียน), พารามิเตอร์ out (ซึ่งจะต้องเขียนก่อนที่จะสามารถอ่านได้) และพารามิเตอร์ out ซึ่งอาจอ่านและเขียนในลำดับใดก็ได้ คอมไพเลอร์ตัดสินใจว่าพารามิเตอร์เฉพาะถูกส่งผ่านโดยค่าหรือโดยการอ้างอิง: มันโปร่งใสให้โปรแกรมเมอร์
void acceptEntireProgrammingLanguageByValue(C++);