【发布时间】:2010-11-12 22:49:24
【问题描述】:
以下代码无法编译。
int a = 1, b = 2, c = 3;
int& arr[] = {a,b,c,8};
C++ 标准对此有何评论?
我知道我可以声明一个包含引用的类,然后创建该类的数组,如下所示。但是我很想知道为什么上面的代码不能编译。
struct cintref
{
cintref(const int & ref) : ref(ref) {}
operator const int &() { return ref; }
private:
const int & ref;
void operator=(const cintref &);
};
int main()
{
int a=1,b=2,c=3;
//typedef const int & cintref;
cintref arr[] = {a,b,c,8};
}
可以使用struct cintref 代替const int & 来模拟引用数组。
【问题讨论】:
-
即使数组有效,在其中存储原始 '8' 值也行不通。如果你做了“intlink value = 8;”,它会死得很惨,因为它几乎只是翻译成“const int & value = 8;”。引用必须引用变量。
-
intlink value = 8;确实有效。看看你是否不相信。 -
正如 Alexey 所指出的,将右值绑定到 const 引用是完全有效的。
-
不起作用的是
operator=。不能重新安装引用。如果你真的想要这样的语义——尽管我个人没有发现它们实际上有用的情况——那么std::reference_wrapper将是这样做的方法,因为它实际上存储了一个指针但提供了类似引用的operators 和 确实 允许重新安装。但是我只需要一个指针! -
operator= 是私有的,未实现,也就是 C++11 中的 =delete。