ニューメリックスの章では、彼は次のコードスニペットを示し、Stroustrup氏のC++プログラミング言語の本(第3版)では:問題はされていない、v_even
とv_odd
が一時に非const参照で、あるStroustrupは非const参照を一時的にどのように受け取りますか?
void f(valarray<double>& d)
{
slice_array<double>& v_even = d[slice(0,d.size()/2,2)];
slice_array<double>& v_odd = d[slice(1,d.size()/2,2)];
v_odd *= v_even;
v_even = 0;
}
を許可されます。そして、これをコンパイルしようとすると、エラーを発する:
error: non-const lvalue reference to type 'slice_array<double>' cannot bind to a temporary of type 'slice_array<double>'
slice_array<double>& v_even = d[slice(0,d.size()/2,2)];
^ ~~~~~~~~~~~~~~~~~~~~~~~~
私は正誤表利用できるオンラインのすべてをチェックして、この根本的な問題により触れるものは何もありません。何か不足していますか?書籍は印刷されて以来、この点で言語が変わったのだろうか(おそらく、本自体は一時的なものではない参照に対して規則を述べているので)何が起きてる?
参照の代わりに値を使用するように関数を変更した場合。 slice_array<double> v_even = ...
、これは実際にコンパイルされます。しかし、ローカルのC++ヘッダーはコピーコンストラクターをパブリックにしますが、Stroustrupとさまざまなオンラインリファレンス(cppreference.com、cplusplus.com)ではコピーコンストラクターがプライベートであると主張しています。私は、このソリューションが移植性がないことを意味します。これは、Stroustrupが非参照変数を持つコードサンプルを明示的にリストし、エラーを生成するという事実によって補強されています。
C++ 98仕様(PDF)は、プライベートコピーコンストラクタを持つものとしてslice_array<T>
を宣言します。 2005年(this specによる)、おそらくC++ 03の一部として、これはパブリックコピーコンストラクタに変更されました。
"この本は印刷されて以来この点で言語の変更がありました。" "参照バインディングルールは非常に古いものです。 'valarray'は最近です。それはエラーのように見えます(BSによる)。 – curiousguy
@curiousguy:この本は20回印刷されました。私はすべての正誤表を見渡した。 2回の印刷でこの機能が変更されましたが、面白いことに、2回目の変更が最初の変更を実際に元に戻しました。どちらの変更も当面の問題に関連していませんでした。 –
"_本は20回印刷されました._"収束し始めますか? – curiousguy