2011-09-11 12 views
4

警告为常量当我编译使用ICC 11 C++程序,它给了这样的警告:中的typedef

警告#21:类型修饰符是毫无意义的在此声明
的typedef const的direction_vector_ref_t direction_vector_cref_t;

这是说const只是没有意义。我很好奇这个,因为如果这个typedef扩大它将变成const array<double,3>&const是绝对有意义的。为什么它发出这个警告?

回答

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(而不是对象类型)需要推迟到以后。

+0

是的你是对的,这是一个优先考虑的问题。它是'const(type ref)'而不是'(const type)ref' – xis

6

direction_vector_ref_t,我按,它是一个参考。引用是const设计的,所以将const添加到引用是毫无意义的。你可能想要的是引用一个const对象,这不能由typedef完成。您将不得不重复轻微修改的typedef定义。

只是为了澄清:

typedef T& ref; 
typedef const T& cref; 
typedef const ref cref; 

最后一行是一样的第一个,没有第二个。 Typedef不是令牌粘贴,一旦您键入T &作为ref,则ref引用对T类型的引用。如果你添加了const,那么你得到一个对T类型的const引用,而不是对const T类型的引用。

+0

您能否提供一点细节? – xis

+0

@nightcracker:呃......他们当然是。向我展示可让您重新分配参考的代码。 –

+0

@ xis19:还需要更多的细节? Typedef不是令牌粘贴,一旦你将typedef T&as ref,那么ref引用T型的引用。如果你添加了const,那么你得到一个对T类型的const引用,而不是对const T类型的引用。 –