在Stroustrup的《C++程序设计语言》(第三版)中,数字章节中展示了以下代码片段:
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)];
^ ~~~~~~~~~~~~~~~~~~~~~~~~
我查看了所有可用的勘误表,没有涉及到这个根本性问题。我是否遗漏了什么?自那本书印刷以来,语言在这方面有所改变吗(不太可能,因为该书本身提到了针对临时引用的非const规则)?这里发生了什么?
如果我修改函数,使用值而不是引用,例如slice_array<double> v_even = ...
,则实际上可以编译。然而,事实证明我的本地C++头文件使复制构造函数为public,而Stroustrup和各种在线参考资料(cppreference.com、cplusplus.com)声称复制构造函数为private。我认为这意味着这个解决方案不具备可移植性。这得到了加强,因为Stroustrup明确列出了一个代码示例,其中包含非引用变量,并指出这会产生错误。
C++98规范(PDF)声明slice_array<T>
具有私有复制构造函数。到2005年(根据此规范),可能作为C++03的一部分,这个复制构造函数变为公共。
valarray
更为新近。看起来像是一个错误(由BS引起的)。 - curiousguy