Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   casting from 'const string' to a 'non-constant string' (http://www.velocityreviews.com/forums/t953602-casting-from-const-string-to-a-non-constant-string.html)

Rene Ivon Shamberger 10-19-2012 12:36 PM

casting from 'const string' to a 'non-constant string'
 
const std::string& someClass::someMethod(){ return some_string = "Bla Bla Bla"; }
.....
const std::string& myMethod(){
someClass obj;
return obj.someMethod();
}

Left as it is, this example will give me a warning stating that the return value from myMethod is a local value, but if I change the code to:

const std::string&
someClass::someMethod(){ return some_string = "Bla Bla Bla"; }
const std::string& myMethod(){
someClass obj;
std::string tmp = obj.someMethod(); /// New code
return temp;
}
The compiler complains saying that conversion from 'const string' to 'string' is not permited.
How can I remove this error?

Juha Nieminen 10-19-2012 12:55 PM

Re: casting from 'const string' to a 'non-constant string'
 
Rene Ivon Shamberger <arbolone@gmail.com> wrote:
> const std::string&
> someClass::someMethod(){ return some_string = "Bla Bla Bla"; }
> const std::string& myMethod(){
> someClass obj;
> std::string tmp = obj.someMethod(); /// New code
> return temp;
> }


You should always post code that actually *compiles* rather than typing
at as you go. (For instance, the name 'temp' is undeclared there.)

Anyways, I don't see what causes the error message (probably something
you *didn't* write above), but I do know that you are returning a reference
to a temporary, which is erroneous. (Undefined behavior, may cause the
program to crash or misbehave in some othe rway.)

Victor Bazarov 10-19-2012 06:42 PM

Re: casting from 'const string' to a 'non-constant string'
 
On 10/19/2012 8:36 AM, Rene Ivon Shamberger wrote:
> const std::string& someClass::someMethod(){ return some_string = "Bla Bla Bla"; }


What's 'some_string'? A member? A global variable?

> ....
> const std::string& myMethod(){
> someClass obj;
> return obj.someMethod();


Right after this expression is evaluated and its value is prepared to be
returned, the 'obj' object is destroyed. *If* 'someMethod' returns part
of the object for which it's called, as a reference to const, that
reference becomes *invalid* as soon as 'obj' is destroyed, i.e. outside
of the 'myMethod' function. IOW, you can't use the return value of the
'myMethod' function at all - that's undefined behavior.

> }
>
> Left as it is, this example will give me a warning stating that the return value from myMethod is a local value, but if I change the code to:
>
> const std::string&
> someClass::someMethod(){ return some_string = "Bla Bla Bla"; }
> const std::string& myMethod(){
> someClass obj;
> std::string tmp = obj.someMethod(); /// New code
> return temp;
> }
> The compiler complains saying that conversion from 'const string' to 'string' is not permited.


On which line? What's 'temp'? Is it a global variable? Where is this
'myMethod' function defined? A namespace scope or inside another class?

> How can I remove this error?


Don't "remove this error". Code correctly. Do not return references to
local objects. Ever.

Also, read the FAQ 5.8.

V
--
I do not respond to top-posted replies, please don't ask


All times are GMT. The time now is 06:11 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.