当我使用icc 11编译C ++程序时,它发出了警告:
警告#21:类型限定符在本声明中无意义
typedef const direction_vector_ref_t direction_vector_cref_t;
它说const
毫无意义。我对此感到好奇,因为如果typedef
扩展,它将转变为const array<double,3>&
,而const
肯定是有意义的。为什么会发出此警告?
答案 0 :(得分:6)
direction_vector_ref_t,我压力,它的参考。引用是const设计,因此将const添加到引用是没有意义的。你可能想要的是引用一个const对象,这是一个typedef无法完成的。您将不得不重复略微修改的typedef定义。
只是为了澄清:
typedef T& ref;
typedef const T& cref;
typedef const ref cref;
最后一行与第一行相同,而不是第二行。一旦你输入了T&amp; T&amp;作为ref,则ref引用对T类型的引用。如果你向它添加const,那么你得到一个对T类型的const引用,而不是对const T类型的引用。
答案 1 :(得分:4)
array<double, 3> a;
direction_vector_cref_t b = a;
b[0] = 1.0;
这里的问题是,当你使用typedef时,它在概念上会在类型周围添加括号,所以你在概念上使用const (array<double, 3>&)
而不是(const array<double, 3>)&
,所以你实际上并没有使用它对象常数。所以你的宣言更像是:
typedef array<double, 3>& const direction_vector_cref_t;
在上面,变量的const(而不是引用类型)需要推迟到以后。