开发者

Warning for const in typedef

开发者 https://www.devze.com 2023-04-04 07:34 出处:网络
When I was compiling a C++ program using icc 11, it gave this warning: warning #21: type qualifiers are meaningless in this declaration

When I was compiling a C++ program using icc 11, it gave this warning:

warning #21: type qualifiers are meaningless in this declaration

typedef const direction_vector_ref_t direction_vector_cref_t;

I开发者_JAVA技巧t is saying const just meaningless. I am curious about this since if this typedef expands it will turn into const array<double,3>& and the const is definitely meaningful. Why it gave this warning?


direction_vector_ref_t, I pressume, its a reference. References are const by design, so adding const to a reference is meaningless. What you probably want is to make a reference to a const object, which can't be done by a typedef. You will have to repeat the slightly modified typedef definition.

Just to clarify:

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

The last line is the same as the first one, not the second one. Typedefs are not token pasting, once you typedef T& as ref, then ref refers to the reference to T type. If you add const to it, then you get a const reference to T type, not a reference to a const T type.


Are you sure? Try:

array<double, 3> a;
direction_vector_cref_t b = a;
b[0] = 1.0;

The issue here, is that when you use a typedef, it conceptually adds parentheses around the type, so you are conceptually using const (array<double, 3>&) as opposed to (const array<double, 3>)&, so you are not actually making the referent object constant. So your declaration is more like:

typedef array<double, 3>& const direction_vector_cref_t;

And in the above, the const for the variable (rather than the referent type) needs to be deferred till later.

0

精彩评论

暂无评论...
验证码 换一张
取 消