StroustrupのC++プログラミング言語の本(第3版)の数値の章で、彼は次のコードスニペットを示しています。
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;
}
問題は、一時的なものv_even
へv_odd
の非定数参照であり、許可されていません。そして、これをコンパイルしようとすると、エラーが発生します。
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仕様(PDFslice_array<T>
)は、プライベートコピーコンストラクターを持つことを宣言しています。2005年までに(この仕様によると)、おそらくC ++ 03の一部として、これはパブリックコピーコンストラクターに変更されました。