Is it safe to use c_str() on a temporary string? The Next CEO of Stack OverflowIs a string literal in c++ created in static memory?string and const char* and .c_str()?How do I iterate over the words of a string?Why is 'this' a pointer and not a reference?Why does std::ends cause string comparison to fail?Return value for a << operator function of a custom string class in C++Returning value from a functionconst qualifier for a string literalEasiest way to convert int to string in C++How can I convert a std::basic_string type to an array of char type?C++ Concatenating const char * with string, only const char * printsSystemC sc_uint from String Object

Are there languages with no euphemisms?

Why here is plural "We went to the movies last night."

How should I support this large drywall patch?

How easy is it to start Magic from scratch?

Grabbing quick drinks

Customer Requests (Sometimes) Drive Me Bonkers!

What happens if you roll doubles 3 times then land on "Go to jail?"

How to be diplomatic in refusing to write code that breaches the privacy of our users

Can the Reverse Gravity spell affect the Meteor Swarm spell?

Why didn't Theresa May consult with Parliament before negotiating a deal with the EU?

How do I go from 300 unfinished/half written blog posts, to published posts?

What makes a siege story/plot interesting?

Too much space between section and text in a twocolumn document

Is a stroke of luck acceptable after a series of unfavorable events?

Inappropriate reference requests from Journal reviewers

Trouble understanding the speech of overseas colleagues

Why were Madagascar and New Zealand discovered so late?

What do "high sea" and "carry" mean in this sentence?

Describing a person. What needs to be mentioned?

I believe this to be a fraud - hired, then asked to cash check and send cash as Bitcoin

How to start emacs in "nothing" mode (`fundamental-mode`)

When airplanes disconnect from a tanker during air to air refueling, why do they bank so sharply to the right?

If I blow insulation everywhere in my attic except the door trap, will heat escape through it?

Whats the best way to handle refactoring a big file?



Is it safe to use c_str() on a temporary string?



The Next CEO of Stack OverflowIs a string literal in c++ created in static memory?string and const char* and .c_str()?How do I iterate over the words of a string?Why is 'this' a pointer and not a reference?Why does std::ends cause string comparison to fail?Return value for a << operator function of a custom string class in C++Returning value from a functionconst qualifier for a string literalEasiest way to convert int to string in C++How can I convert a std::basic_string type to an array of char type?C++ Concatenating const char * with string, only const char * printsSystemC sc_uint from String Object










6















#include <iostream>

std::string get_data()

return "Hello";


int main()

const char* data = get_data().c_str();
std::cout << data << "n";
return 0;



"Hello" is printing on my machine; however, I am led to believe that this behavior is unspecified i.e. implementation-specific. Am I correct or will it always print "Hello", judging that the returned string is immutable and as such qualified as something that is constant? Thanks in advance!










share|improve this question









New contributor




Aknin Abdo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.















  • 1





    Where does that string that gets returned go after c_str() is called and returns a pointer to some data?

    – tadman
    2 hours ago






  • 2





    stackoverflow.com/questions/23464504/…

    – Wyck
    2 hours ago






  • 2





    Probably not a duplicate but helpful: stackoverflow.com/questions/349025/…. Also your interview question is missing #include <string> so technically it would be a compiler error ;)

    – Tas
    2 hours ago






  • 1





    I'm a bit surprised that the documentation for std::string::c_str doesn't mention destruction of the string as grounds for the returned pointer being invalidated (unless you consider the destructor to be a non-const member function). I think many people coming from a C background would benefit from having this written explicitly

    – alter igel
    2 hours ago







  • 1





    @Tas: io-streams implement the shift-operators including overloads on basic_string ,so it needs its definition which requires it to include <string>. So it can't be a compiler error.

    – engf-010
    2 hours ago















6















#include <iostream>

std::string get_data()

return "Hello";


int main()

const char* data = get_data().c_str();
std::cout << data << "n";
return 0;



"Hello" is printing on my machine; however, I am led to believe that this behavior is unspecified i.e. implementation-specific. Am I correct or will it always print "Hello", judging that the returned string is immutable and as such qualified as something that is constant? Thanks in advance!










share|improve this question









New contributor




Aknin Abdo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.















  • 1





    Where does that string that gets returned go after c_str() is called and returns a pointer to some data?

    – tadman
    2 hours ago






  • 2





    stackoverflow.com/questions/23464504/…

    – Wyck
    2 hours ago






  • 2





    Probably not a duplicate but helpful: stackoverflow.com/questions/349025/…. Also your interview question is missing #include <string> so technically it would be a compiler error ;)

    – Tas
    2 hours ago






  • 1





    I'm a bit surprised that the documentation for std::string::c_str doesn't mention destruction of the string as grounds for the returned pointer being invalidated (unless you consider the destructor to be a non-const member function). I think many people coming from a C background would benefit from having this written explicitly

    – alter igel
    2 hours ago







  • 1





    @Tas: io-streams implement the shift-operators including overloads on basic_string ,so it needs its definition which requires it to include <string>. So it can't be a compiler error.

    – engf-010
    2 hours ago













6












6








6








#include <iostream>

std::string get_data()

return "Hello";


int main()

const char* data = get_data().c_str();
std::cout << data << "n";
return 0;



"Hello" is printing on my machine; however, I am led to believe that this behavior is unspecified i.e. implementation-specific. Am I correct or will it always print "Hello", judging that the returned string is immutable and as such qualified as something that is constant? Thanks in advance!










share|improve this question









New contributor




Aknin Abdo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.












#include <iostream>

std::string get_data()

return "Hello";


int main()

const char* data = get_data().c_str();
std::cout << data << "n";
return 0;



"Hello" is printing on my machine; however, I am led to believe that this behavior is unspecified i.e. implementation-specific. Am I correct or will it always print "Hello", judging that the returned string is immutable and as such qualified as something that is constant? Thanks in advance!







c++






share|improve this question









New contributor




Aknin Abdo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question









New contributor




Aknin Abdo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question








edited 2 hours ago









alter igel

3,44711230




3,44711230






New contributor




Aknin Abdo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked 3 hours ago









Aknin AbdoAknin Abdo

341




341




New contributor




Aknin Abdo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





Aknin Abdo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






Aknin Abdo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







  • 1





    Where does that string that gets returned go after c_str() is called and returns a pointer to some data?

    – tadman
    2 hours ago






  • 2





    stackoverflow.com/questions/23464504/…

    – Wyck
    2 hours ago






  • 2





    Probably not a duplicate but helpful: stackoverflow.com/questions/349025/…. Also your interview question is missing #include <string> so technically it would be a compiler error ;)

    – Tas
    2 hours ago






  • 1





    I'm a bit surprised that the documentation for std::string::c_str doesn't mention destruction of the string as grounds for the returned pointer being invalidated (unless you consider the destructor to be a non-const member function). I think many people coming from a C background would benefit from having this written explicitly

    – alter igel
    2 hours ago







  • 1





    @Tas: io-streams implement the shift-operators including overloads on basic_string ,so it needs its definition which requires it to include <string>. So it can't be a compiler error.

    – engf-010
    2 hours ago












  • 1





    Where does that string that gets returned go after c_str() is called and returns a pointer to some data?

    – tadman
    2 hours ago






  • 2





    stackoverflow.com/questions/23464504/…

    – Wyck
    2 hours ago






  • 2





    Probably not a duplicate but helpful: stackoverflow.com/questions/349025/…. Also your interview question is missing #include <string> so technically it would be a compiler error ;)

    – Tas
    2 hours ago






  • 1





    I'm a bit surprised that the documentation for std::string::c_str doesn't mention destruction of the string as grounds for the returned pointer being invalidated (unless you consider the destructor to be a non-const member function). I think many people coming from a C background would benefit from having this written explicitly

    – alter igel
    2 hours ago







  • 1





    @Tas: io-streams implement the shift-operators including overloads on basic_string ,so it needs its definition which requires it to include <string>. So it can't be a compiler error.

    – engf-010
    2 hours ago







1




1





Where does that string that gets returned go after c_str() is called and returns a pointer to some data?

– tadman
2 hours ago





Where does that string that gets returned go after c_str() is called and returns a pointer to some data?

– tadman
2 hours ago




2




2





stackoverflow.com/questions/23464504/…

– Wyck
2 hours ago





stackoverflow.com/questions/23464504/…

– Wyck
2 hours ago




2




2





Probably not a duplicate but helpful: stackoverflow.com/questions/349025/…. Also your interview question is missing #include <string> so technically it would be a compiler error ;)

– Tas
2 hours ago





Probably not a duplicate but helpful: stackoverflow.com/questions/349025/…. Also your interview question is missing #include <string> so technically it would be a compiler error ;)

– Tas
2 hours ago




1




1





I'm a bit surprised that the documentation for std::string::c_str doesn't mention destruction of the string as grounds for the returned pointer being invalidated (unless you consider the destructor to be a non-const member function). I think many people coming from a C background would benefit from having this written explicitly

– alter igel
2 hours ago






I'm a bit surprised that the documentation for std::string::c_str doesn't mention destruction of the string as grounds for the returned pointer being invalidated (unless you consider the destructor to be a non-const member function). I think many people coming from a C background would benefit from having this written explicitly

– alter igel
2 hours ago





1




1





@Tas: io-streams implement the shift-operators including overloads on basic_string ,so it needs its definition which requires it to include <string>. So it can't be a compiler error.

– engf-010
2 hours ago





@Tas: io-streams implement the shift-operators including overloads on basic_string ,so it needs its definition which requires it to include <string>. So it can't be a compiler error.

– engf-010
2 hours ago












2 Answers
2






active

oldest

votes


















7














The code exhibits undefined behavior.



get_data() returns a temporary which expires at the end of the full expression (*):



const char* data = get_data().c_str() ;
// ^~~~~~~~~~ ^
// this evaluates |
// to a prvalue |
// temporary expires here


data points to an internal of that object, so after the temporary ends you are left with a dangling pointer. Accessing it leads to Undefined Behavior. So the next line std::cout << data << "n"; makes the whole program exhibit Undefined Behavior.




*) There is an exception to this rule which doesn't apply here. If a prvalue is directly bound to a reference, the lifetime of the prvalue is extended to the lifetime of the reference.



For instance, this would have been fine:



int main()

const std::string& ref = get_data();
const char* data = ref.c_str();
std::cout << data << "n";
return 0;






share|improve this answer

























  • Your answer should include something with the words sequence point to get my upvote, because people still search for that - even though it doesn't appear in the standard.

    – Wyck
    2 hours ago







  • 1





    @Wyck I don't see how sequence points are relevant here. The only thing that matters is the lifetime of the temporary. And that lifetime is until the end of the full expression it appears on.

    – bolov
    2 hours ago






  • 1





    @Wyck newer standards don't use "sequence points" indeed. They use "sequenced after" and "sequenced before". I still don't see the connection to the problem at hand... Maybe I am missing something, could you please tell how sequencing relates here?

    – bolov
    2 hours ago






  • 1





    @Wyck a single statement can possibly have multiple sequencing considerations, but they would not affect when a temporary is destroyed

    – kmdreko
    2 hours ago






  • 1





    The only thing that this doesn't cover is the Asker's statement that judging that the returned string is immutable suggests that they might not know that the string literal and the returned std::string are separate objects.

    – user4581301
    2 hours ago


















1














Yes it is, but not the way you're doing it.



If you did this:



std::cout << get_data().c_str() << 'n';


you'd be just fine.



That's because a temporary is guaranteed to live for the lifetime of the full expression it was created in. It may live longer in certain, very specific circumstances.



If you bind a reference to a temporary, it's lifetime will be extended to be the lifetime of the name it was bound to. So, code like this:



std::string const &x = get_data();
std::cout << x.c_str() << 'n';


would also work because the temporary returned by get_data would be bound to the reference named x, and so as long as x remained a valid name to use, the temporary would still exist.






share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "1"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );






    Aknin Abdo is a new contributor. Be nice, and check out our Code of Conduct.









    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55408411%2fis-it-safe-to-use-c-str-on-a-temporary-string%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    7














    The code exhibits undefined behavior.



    get_data() returns a temporary which expires at the end of the full expression (*):



    const char* data = get_data().c_str() ;
    // ^~~~~~~~~~ ^
    // this evaluates |
    // to a prvalue |
    // temporary expires here


    data points to an internal of that object, so after the temporary ends you are left with a dangling pointer. Accessing it leads to Undefined Behavior. So the next line std::cout << data << "n"; makes the whole program exhibit Undefined Behavior.




    *) There is an exception to this rule which doesn't apply here. If a prvalue is directly bound to a reference, the lifetime of the prvalue is extended to the lifetime of the reference.



    For instance, this would have been fine:



    int main()

    const std::string& ref = get_data();
    const char* data = ref.c_str();
    std::cout << data << "n";
    return 0;






    share|improve this answer

























    • Your answer should include something with the words sequence point to get my upvote, because people still search for that - even though it doesn't appear in the standard.

      – Wyck
      2 hours ago







    • 1





      @Wyck I don't see how sequence points are relevant here. The only thing that matters is the lifetime of the temporary. And that lifetime is until the end of the full expression it appears on.

      – bolov
      2 hours ago






    • 1





      @Wyck newer standards don't use "sequence points" indeed. They use "sequenced after" and "sequenced before". I still don't see the connection to the problem at hand... Maybe I am missing something, could you please tell how sequencing relates here?

      – bolov
      2 hours ago






    • 1





      @Wyck a single statement can possibly have multiple sequencing considerations, but they would not affect when a temporary is destroyed

      – kmdreko
      2 hours ago






    • 1





      The only thing that this doesn't cover is the Asker's statement that judging that the returned string is immutable suggests that they might not know that the string literal and the returned std::string are separate objects.

      – user4581301
      2 hours ago















    7














    The code exhibits undefined behavior.



    get_data() returns a temporary which expires at the end of the full expression (*):



    const char* data = get_data().c_str() ;
    // ^~~~~~~~~~ ^
    // this evaluates |
    // to a prvalue |
    // temporary expires here


    data points to an internal of that object, so after the temporary ends you are left with a dangling pointer. Accessing it leads to Undefined Behavior. So the next line std::cout << data << "n"; makes the whole program exhibit Undefined Behavior.




    *) There is an exception to this rule which doesn't apply here. If a prvalue is directly bound to a reference, the lifetime of the prvalue is extended to the lifetime of the reference.



    For instance, this would have been fine:



    int main()

    const std::string& ref = get_data();
    const char* data = ref.c_str();
    std::cout << data << "n";
    return 0;






    share|improve this answer

























    • Your answer should include something with the words sequence point to get my upvote, because people still search for that - even though it doesn't appear in the standard.

      – Wyck
      2 hours ago







    • 1





      @Wyck I don't see how sequence points are relevant here. The only thing that matters is the lifetime of the temporary. And that lifetime is until the end of the full expression it appears on.

      – bolov
      2 hours ago






    • 1





      @Wyck newer standards don't use "sequence points" indeed. They use "sequenced after" and "sequenced before". I still don't see the connection to the problem at hand... Maybe I am missing something, could you please tell how sequencing relates here?

      – bolov
      2 hours ago






    • 1





      @Wyck a single statement can possibly have multiple sequencing considerations, but they would not affect when a temporary is destroyed

      – kmdreko
      2 hours ago






    • 1





      The only thing that this doesn't cover is the Asker's statement that judging that the returned string is immutable suggests that they might not know that the string literal and the returned std::string are separate objects.

      – user4581301
      2 hours ago













    7












    7








    7







    The code exhibits undefined behavior.



    get_data() returns a temporary which expires at the end of the full expression (*):



    const char* data = get_data().c_str() ;
    // ^~~~~~~~~~ ^
    // this evaluates |
    // to a prvalue |
    // temporary expires here


    data points to an internal of that object, so after the temporary ends you are left with a dangling pointer. Accessing it leads to Undefined Behavior. So the next line std::cout << data << "n"; makes the whole program exhibit Undefined Behavior.




    *) There is an exception to this rule which doesn't apply here. If a prvalue is directly bound to a reference, the lifetime of the prvalue is extended to the lifetime of the reference.



    For instance, this would have been fine:



    int main()

    const std::string& ref = get_data();
    const char* data = ref.c_str();
    std::cout << data << "n";
    return 0;






    share|improve this answer















    The code exhibits undefined behavior.



    get_data() returns a temporary which expires at the end of the full expression (*):



    const char* data = get_data().c_str() ;
    // ^~~~~~~~~~ ^
    // this evaluates |
    // to a prvalue |
    // temporary expires here


    data points to an internal of that object, so after the temporary ends you are left with a dangling pointer. Accessing it leads to Undefined Behavior. So the next line std::cout << data << "n"; makes the whole program exhibit Undefined Behavior.




    *) There is an exception to this rule which doesn't apply here. If a prvalue is directly bound to a reference, the lifetime of the prvalue is extended to the lifetime of the reference.



    For instance, this would have been fine:



    int main()

    const std::string& ref = get_data();
    const char* data = ref.c_str();
    std::cout << data << "n";
    return 0;







    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited 2 hours ago

























    answered 2 hours ago









    bolovbolov

    33.1k876140




    33.1k876140












    • Your answer should include something with the words sequence point to get my upvote, because people still search for that - even though it doesn't appear in the standard.

      – Wyck
      2 hours ago







    • 1





      @Wyck I don't see how sequence points are relevant here. The only thing that matters is the lifetime of the temporary. And that lifetime is until the end of the full expression it appears on.

      – bolov
      2 hours ago






    • 1





      @Wyck newer standards don't use "sequence points" indeed. They use "sequenced after" and "sequenced before". I still don't see the connection to the problem at hand... Maybe I am missing something, could you please tell how sequencing relates here?

      – bolov
      2 hours ago






    • 1





      @Wyck a single statement can possibly have multiple sequencing considerations, but they would not affect when a temporary is destroyed

      – kmdreko
      2 hours ago






    • 1





      The only thing that this doesn't cover is the Asker's statement that judging that the returned string is immutable suggests that they might not know that the string literal and the returned std::string are separate objects.

      – user4581301
      2 hours ago

















    • Your answer should include something with the words sequence point to get my upvote, because people still search for that - even though it doesn't appear in the standard.

      – Wyck
      2 hours ago







    • 1





      @Wyck I don't see how sequence points are relevant here. The only thing that matters is the lifetime of the temporary. And that lifetime is until the end of the full expression it appears on.

      – bolov
      2 hours ago






    • 1





      @Wyck newer standards don't use "sequence points" indeed. They use "sequenced after" and "sequenced before". I still don't see the connection to the problem at hand... Maybe I am missing something, could you please tell how sequencing relates here?

      – bolov
      2 hours ago






    • 1





      @Wyck a single statement can possibly have multiple sequencing considerations, but they would not affect when a temporary is destroyed

      – kmdreko
      2 hours ago






    • 1





      The only thing that this doesn't cover is the Asker's statement that judging that the returned string is immutable suggests that they might not know that the string literal and the returned std::string are separate objects.

      – user4581301
      2 hours ago
















    Your answer should include something with the words sequence point to get my upvote, because people still search for that - even though it doesn't appear in the standard.

    – Wyck
    2 hours ago






    Your answer should include something with the words sequence point to get my upvote, because people still search for that - even though it doesn't appear in the standard.

    – Wyck
    2 hours ago





    1




    1





    @Wyck I don't see how sequence points are relevant here. The only thing that matters is the lifetime of the temporary. And that lifetime is until the end of the full expression it appears on.

    – bolov
    2 hours ago





    @Wyck I don't see how sequence points are relevant here. The only thing that matters is the lifetime of the temporary. And that lifetime is until the end of the full expression it appears on.

    – bolov
    2 hours ago




    1




    1





    @Wyck newer standards don't use "sequence points" indeed. They use "sequenced after" and "sequenced before". I still don't see the connection to the problem at hand... Maybe I am missing something, could you please tell how sequencing relates here?

    – bolov
    2 hours ago





    @Wyck newer standards don't use "sequence points" indeed. They use "sequenced after" and "sequenced before". I still don't see the connection to the problem at hand... Maybe I am missing something, could you please tell how sequencing relates here?

    – bolov
    2 hours ago




    1




    1





    @Wyck a single statement can possibly have multiple sequencing considerations, but they would not affect when a temporary is destroyed

    – kmdreko
    2 hours ago





    @Wyck a single statement can possibly have multiple sequencing considerations, but they would not affect when a temporary is destroyed

    – kmdreko
    2 hours ago




    1




    1





    The only thing that this doesn't cover is the Asker's statement that judging that the returned string is immutable suggests that they might not know that the string literal and the returned std::string are separate objects.

    – user4581301
    2 hours ago





    The only thing that this doesn't cover is the Asker's statement that judging that the returned string is immutable suggests that they might not know that the string literal and the returned std::string are separate objects.

    – user4581301
    2 hours ago













    1














    Yes it is, but not the way you're doing it.



    If you did this:



    std::cout << get_data().c_str() << 'n';


    you'd be just fine.



    That's because a temporary is guaranteed to live for the lifetime of the full expression it was created in. It may live longer in certain, very specific circumstances.



    If you bind a reference to a temporary, it's lifetime will be extended to be the lifetime of the name it was bound to. So, code like this:



    std::string const &x = get_data();
    std::cout << x.c_str() << 'n';


    would also work because the temporary returned by get_data would be bound to the reference named x, and so as long as x remained a valid name to use, the temporary would still exist.






    share|improve this answer



























      1














      Yes it is, but not the way you're doing it.



      If you did this:



      std::cout << get_data().c_str() << 'n';


      you'd be just fine.



      That's because a temporary is guaranteed to live for the lifetime of the full expression it was created in. It may live longer in certain, very specific circumstances.



      If you bind a reference to a temporary, it's lifetime will be extended to be the lifetime of the name it was bound to. So, code like this:



      std::string const &x = get_data();
      std::cout << x.c_str() << 'n';


      would also work because the temporary returned by get_data would be bound to the reference named x, and so as long as x remained a valid name to use, the temporary would still exist.






      share|improve this answer

























        1












        1








        1







        Yes it is, but not the way you're doing it.



        If you did this:



        std::cout << get_data().c_str() << 'n';


        you'd be just fine.



        That's because a temporary is guaranteed to live for the lifetime of the full expression it was created in. It may live longer in certain, very specific circumstances.



        If you bind a reference to a temporary, it's lifetime will be extended to be the lifetime of the name it was bound to. So, code like this:



        std::string const &x = get_data();
        std::cout << x.c_str() << 'n';


        would also work because the temporary returned by get_data would be bound to the reference named x, and so as long as x remained a valid name to use, the temporary would still exist.






        share|improve this answer













        Yes it is, but not the way you're doing it.



        If you did this:



        std::cout << get_data().c_str() << 'n';


        you'd be just fine.



        That's because a temporary is guaranteed to live for the lifetime of the full expression it was created in. It may live longer in certain, very specific circumstances.



        If you bind a reference to a temporary, it's lifetime will be extended to be the lifetime of the name it was bound to. So, code like this:



        std::string const &x = get_data();
        std::cout << x.c_str() << 'n';


        would also work because the temporary returned by get_data would be bound to the reference named x, and so as long as x remained a valid name to use, the temporary would still exist.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered 1 hour ago









        OmnifariousOmnifarious

        41k11101162




        41k11101162




















            Aknin Abdo is a new contributor. Be nice, and check out our Code of Conduct.









            draft saved

            draft discarded


















            Aknin Abdo is a new contributor. Be nice, and check out our Code of Conduct.












            Aknin Abdo is a new contributor. Be nice, and check out our Code of Conduct.











            Aknin Abdo is a new contributor. Be nice, and check out our Code of Conduct.














            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55408411%2fis-it-safe-to-use-c-str-on-a-temporary-string%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            How should I use the fbox command correctly to avoid producing a Bad Box message?How to put a long piece of text in a box?How to specify height and width of fboxIs there an arrayrulecolor-like command to change the rule color of fbox?What is the command to highlight bad boxes in pdf?Why does fbox sometimes place the box *over* the graphic image?how to put the text in the boxHow to create command for a box where text inside the box can automatically adjust?how can I make an fbox like command with certain color, shape and width of border?how to use fbox in align modeFbox increase the spacing between the box and it content (inner margin)how to change the box height of an equationWhat is the use of the hbox in a newcommand command?

            Doxepinum Nexus interni Notae | Tabula navigationis3158DB01142WHOa682390"Structural Analysis of the Histamine H1 Receptor""Transdermal and Topical Drug Administration in the Treatment of Pain""Antidepressants as antipruritic agents: A review"

            inputenc: Unicode character … not set up for use with LaTeX The Next CEO of Stack OverflowEntering Unicode characters in LaTeXHow to solve the `Package inputenc Error: Unicode char not set up for use with LaTeX` problem?solve “Unicode char is not set up for use with LaTeX” without special handling of every new interesting UTF-8 characterPackage inputenc Error: Unicode character ² (U+B2)(inputenc) not set up for use with LaTeX. acroI2C[I²C]package inputenc error unicode char (u + 190) not set up for use with latexPackage inputenc Error: Unicode char u8:′ not set up for use with LaTeX. 3′inputenc Error: Unicode char u8: not set up for use with LaTeX with G-BriefPackage Inputenc Error: Unicode char u8: not set up for use with LaTeXPackage inputenc Error: Unicode char ́ (U+301)(inputenc) not set up for use with LaTeX. includePackage inputenc Error: Unicode char ̂ (U+302)(inputenc) not set up for use with LaTeX. … $widehatleft (OA,AA' right )$Package inputenc Error: Unicode char â„¡ (U+2121)(inputenc) not set up for use with LaTeX. printbibliography[heading=bibintoc]Package inputenc Error: Unicode char − (U+2212)(inputenc) not set up for use with LaTeXPackage inputenc Error: Unicode character α (U+3B1) not set up for use with LaTeXPackage inputenc Error: Unicode characterError: ! Package inputenc Error: Unicode char ⊘ (U+2298)(inputenc) not set up for use with LaTeX