警告为常量当我编译使用ICC 11 C++程序,它给了这样的警告:中的typedef
警告#21:类型修饰符是毫无意义的在此声明
的typedef const的direction_vector_ref_t direction_vector_cref_t;
这是说const
只是没有意义。我很好奇这个,因为如果这个typedef
扩大它将变成const array<double,3>&
和const
是绝对有意义的。为什么它发出这个警告?
警告为常量当我编译使用ICC 11 C++程序,它给了这样的警告:中的typedef
警告#21:类型修饰符是毫无意义的在此声明
的typedef const的direction_vector_ref_t direction_vector_cref_t;
这是说const
只是没有意义。我很好奇这个,因为如果这个typedef
扩大它将变成const array<double,3>&
和const
是绝对有意义的。为什么它发出这个警告?
你确定吗?尝试:
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(而不是对象类型)需要推迟到以后。
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类型的引用。
您能否提供一点细节? – xis
@nightcracker:呃......他们当然是。向我展示可让您重新分配参考的代码。 –
@ xis19:还需要更多的细节? Typedef不是令牌粘贴,一旦你将typedef T&as ref,那么ref引用T型的引用。如果你添加了const,那么你得到一个对T类型的const引用,而不是对const T类型的引用。 –
是的你是对的,这是一个优先考虑的问题。它是'const(type ref)'而不是'(const type)ref' – xis