
C++、C#、PHP、VB.NET、Delphi(Object Pascal)、Swift、Rust等には「参照渡し」と言われる機能があります。
どれらも、英語では"pass by reference"という表現をしており、Microsoftやembarcaderoは「参照渡し」、PHP日本語訳チームは「リファレンス渡し」と訳しています。C++については、仕様書にそのまま"pass by reference"という言葉の解説はみつけられませんでしたが、n4659のp.855などで"~ be passed by reference"という表現が使われています。
上記のような言語では、"pass by reference"(英語圏では"call by reference"とも言われる場合がある)と言われる機能があります。私が解釈する限り、これらの機能は同一のものです。そして、その日本語訳として「参照渡し」というのは特におかしくないと思います。
さて、私が聞きたいのは、言語の機能として「参照渡し("pass by reference")」がある場合の話ではありません。言語の機能として「参照渡し」がない、少なくとも、英語の公式ドキュメントで"pass by reference"がない言語、ましてや、Pythonのように値渡しであると公式ドキュメントに書いてある言語において、「参照渡し」が意味する物が何であるのかと言うことです。これらを一部の人達は広義の意味での「参照渡し」と言っているようですので、以下、この質問では「広義の参照渡し」とし、前述のC++等での機能を「狭義の参照渡し」とします。(そういう言葉があるわけではありませんので、ご注意ください。この質問でのみの表現です。)つまり、聞きたいこと事は端的に言うと以下になります。
「広義の参照渡し」の定義は何ですか?
また、その定義から、C、Java、JavaScript、Python、Ruby、Groovy、Go、Haskell、Scala、Kotlin、R、Lua等の「狭義の参照渡し」が無い言語において「広義の参照渡し」とは具体的にどのような動作のことを指すのかの説明も加えていただければ幸いです。逆に「広義の参照渡し」すらない言語はどのような物があるのかも教えて頂くと助かります。
なお、回答では「広義の参照渡し」と「狭義の参照渡し」を区別していただくようお願いします。「区別することが不可能である」と考えているのであれば、単に「参照渡し」と書いても良いですが、その場合は、「区別することが不可能である」理由も添えて頂くと助かります。
「狭義の参照渡し」がある言語やない言語のリストは、私も全ての言語に詳しいわけではありませんので、間違いがあるかも知れません。また、この言語も足して欲しいという場合もあると思います。その場合は、追記・修正依頼で指摘して頂くと助かります。
不公平感が出ないように、私の考えの立場を言っておきます。私は「『狭義の参照渡し』と混合するから『広義の参照渡しは』使うべきではない」と考えています。ただ、この考えを全ての人に押しつける気はなく、C++等を学ぶことが生涯ない人は別にそれでいいのではないかと思っています。「広義の参照渡し」の事例は集めていますが、私自身「広義の参照渡し」なるものの使用を前述の理由で避けていたため、どのような場合に使われる事が多いことを知っていても、その定義がどのようなものか、どのような場合に使うべきかまでは考察したことがありません。そのため、既にそれらに確固たる信念をもって使用されている方にお聞きすべく、この質問をすることにしました。
この質問で、別に「広義の参照渡し」を使うなと言っているわけではありません。どのような意味で「広義の参照渡し」を使っているのかを知りたいという純粋なる知識欲から質問しています。



