Re: Strange warning from g++ "returning reference to temporary"
blargg wrote:
Martin T. wrote:
blargg wrote:
Bo Persson wrote:
...
The const version returns a different type, and so possibly
involves a conversion - creating a temporary.
[...]
I'm confused, since as far as I understand, returning a pointer
rather than reference WOULD work (4.4 para 4), without creating
any temporaries:
struct Foo
{
char* s;
operator const char* const*() const { return &s; } // OK, right?
I don't think that will compile. You probably meant:
operator const char* const() const { return &s; }
Why not? &s has type 'char* const*', which is convertible to 'const
char* const*' (C++03 section 4.4 paragraph 4).
operator const char* const&() const { return s; } // why not
OK?
Because your member is of type [char*]. You are casting from [char*]
to
[const char*] and that is a different type. Note that:
operator char* const() const& { return s; }
should work.
I'm assuming you mean
operator char* const& () const { return s; }
Sure, this will work, but it eliminates the interesting aspect.
Since the equivalent pointer version is OK, why shouldn't I be able to
take a reference of type 'const char* const&' to an object of type
'char* const'? I cannot change the pointer through the reference (just
as with the equivalent pointer version), so there's no need for a
temporary. Put another way, if there needed to be a temporary, then
the equivalent pointer version would also need a temporary.
};
If the reference version really is invalid (and the pointer version
not), then this is one glaring difference between references and
pointers where one would expect them to behave the same.
Well. As you a dealing with a [pointer to char] you should compare it
with a [reference to char] and NOT, as you do in the above example,
with
a [reference to pointer to char].
Let's generalize that, for clarity: "As you a dealing with a [pointer
to T] you should compare it with a [reference to T] and NOT, as you do
in the above example, with a [reference to pointer to T]."
Above, I AM doing the first, where T is 'const pointer to const char':
struct Foo
{
char* s;
typedef const char* const T;
operator T* () const { return &s; }
operator T& () const { return s; }
};
Doesn't it seem odd that the operator T* above is valid, but operator
T& is not (at least according to a few compilers and posters here)?
(In case I'm talking nonsense below, it's because my head feels
like 10kg)
In the first case, it is a valid conversion. In the second case,
we are not talking about conversions, but about binding a value to
a reference. So this is a big difference between pointers
and references.
I've said in my other post:
there is no direct binding of T2 to a reference to T1,
where T1 != T2 and T1,T2 are pointers
So, the standard doesn't allow mentioned binding. Sure, there is
a conversion between pointers, but conversions create temporaries.
Anyway, I don't know the reason behind such a decision,
maybe someone else could help with that.
I've seen your other post which shows how to "manually" provide
such a reference, and I guess it proves that pointers too should
be bindable (although I didn't consider other consequences of such
a change).
// I'm saying, why doesn't it instead do this:
operator const char* const&() const
{
const char* const* p = &s; // OK
return *p; // OK, reference to original s object
}
--
Best regards,
Dragan
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]