Why isn't it a compile-time error to return a nullptr as a std::string?Access Violation when sending a 0 int literal to a const string parameterAvoiding improper std::string initialization with NULL const char* using g++Why does constructing std::string(0) not emit a compiler warning?How to concatenate a std::string and an int?What's the best way to trim std::string?How to convert std::string to lower case?How to convert a std::string to const char* or char*?std::wstring VS std::stringconvert a char* to std::stringWhy is “using namespace std;” considered bad practice?Why does outputting a class with a conversion operator not work for std::string?STL map<string, string>, assign 0 value to a key causes compile errorVector push_back error when compiling

Should the party get XP for a monster they never attacked?

How did the Vostok ejection seat safely eject an astronaut from a sealed space capsule?

What are the current battlegrounds for people’s “rights” in the UK?

What is the "ls" directory in my home directory?

How can I ping multiple IP addresses at the same time?

Why is "Congress shall have power to enforce this article by appropriate legislation" necessary?

Proving an Intuitive Result Rigorously

What is the meaning of "понаехать"?

How hard is it to distinguish if I am given remote access to a virtual machine vs a piece of hardware?

How to remove stain from pavement after having dropped sulfuric acid on it?

Find the common ancestor between two nodes of a tree

Is there any proof that high saturation and contrast makes a picture more appealing in social media?

I found a password with hashcat, but it doesn't work

Is there a name for the trope when there is a moments dialogue when someone pauses just before they leave the room?

Can i enter UK for 24 hours from a Schengen area holding an Indian passport?

What was the first third-party commercial application for MS-DOS?

Can the pre-order traversal of two different trees be the same even though they are different?

What is "industrial ethernet"?

How do internally carried IR missiles acquire a lock?

Can you use one creature for both convoke and delve for Hogaak?

Is the specular reflection on a polished gold sphere white or gold in colour?

"What is the maximum that Player 1 can win?"

Has a life raft ever been successfully deployed on a modern commercial flight?

What happened to Hopper's girlfriend in season one?



Why isn't it a compile-time error to return a nullptr as a std::string?


Access Violation when sending a 0 int literal to a const string parameterAvoiding improper std::string initialization with NULL const char* using g++Why does constructing std::string(0) not emit a compiler warning?How to concatenate a std::string and an int?What's the best way to trim std::string?How to convert std::string to lower case?How to convert a std::string to const char* or char*?std::wstring VS std::stringconvert a char* to std::stringWhy is “using namespace std;” considered bad practice?Why does outputting a class with a conversion operator not work for std::string?STL map<string, string>, assign 0 value to a key causes compile errorVector push_back error when compiling






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;








14















Due to a bug, I just found out that this code compiles fine on with Visual Studio 17 and probably on other compilers as well. Now I'm curious why?



#include <iostream>
#include <string>

std::string foo()
return nullptr;


int main()
auto s = foo();
std::cout << s << std::endl;



I could imagine it is because the std::basic_string c'tor could be invoked with a char* and while returning an implicit conversion from ptr to std::string occurs (with NULL as argument and then goes poof). Am I on the right way?










share|improve this question



















  • 1





    it is probably indeed passing nullptr as the parameter for a pointer

    – Tarick Welling
    13 hours ago






  • 2





    It compiles, but you get a runtime error.

    – t.niese
    13 hours ago






  • 7





    It would probably be beneficial to add a string (nullptr_t) = delete ctor, just so this error is caught at compile time. I don't think legitimate programs would break due to that.

    – MSalters
    12 hours ago











  • Related, Why does constructing std::string(0) not emit a compiler warning?, Access Violation when sending a 0 int literal to a const string parameter, Avoiding improper std::string initialization with NULL const char* using g++, How to best protect from 0 passed to std::string parameters?, etc.

    – jww
    17 mins ago

















14















Due to a bug, I just found out that this code compiles fine on with Visual Studio 17 and probably on other compilers as well. Now I'm curious why?



#include <iostream>
#include <string>

std::string foo()
return nullptr;


int main()
auto s = foo();
std::cout << s << std::endl;



I could imagine it is because the std::basic_string c'tor could be invoked with a char* and while returning an implicit conversion from ptr to std::string occurs (with NULL as argument and then goes poof). Am I on the right way?










share|improve this question



















  • 1





    it is probably indeed passing nullptr as the parameter for a pointer

    – Tarick Welling
    13 hours ago






  • 2





    It compiles, but you get a runtime error.

    – t.niese
    13 hours ago






  • 7





    It would probably be beneficial to add a string (nullptr_t) = delete ctor, just so this error is caught at compile time. I don't think legitimate programs would break due to that.

    – MSalters
    12 hours ago











  • Related, Why does constructing std::string(0) not emit a compiler warning?, Access Violation when sending a 0 int literal to a const string parameter, Avoiding improper std::string initialization with NULL const char* using g++, How to best protect from 0 passed to std::string parameters?, etc.

    – jww
    17 mins ago













14












14








14








Due to a bug, I just found out that this code compiles fine on with Visual Studio 17 and probably on other compilers as well. Now I'm curious why?



#include <iostream>
#include <string>

std::string foo()
return nullptr;


int main()
auto s = foo();
std::cout << s << std::endl;



I could imagine it is because the std::basic_string c'tor could be invoked with a char* and while returning an implicit conversion from ptr to std::string occurs (with NULL as argument and then goes poof). Am I on the right way?










share|improve this question
















Due to a bug, I just found out that this code compiles fine on with Visual Studio 17 and probably on other compilers as well. Now I'm curious why?



#include <iostream>
#include <string>

std::string foo()
return nullptr;


int main()
auto s = foo();
std::cout << s << std::endl;



I could imagine it is because the std::basic_string c'tor could be invoked with a char* and while returning an implicit conversion from ptr to std::string occurs (with NULL as argument and then goes poof). Am I on the right way?







c++ stdstring






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 1 hour ago









Cody Gray

198k37391481




198k37391481










asked 13 hours ago









TaronTaron

502520




502520







  • 1





    it is probably indeed passing nullptr as the parameter for a pointer

    – Tarick Welling
    13 hours ago






  • 2





    It compiles, but you get a runtime error.

    – t.niese
    13 hours ago






  • 7





    It would probably be beneficial to add a string (nullptr_t) = delete ctor, just so this error is caught at compile time. I don't think legitimate programs would break due to that.

    – MSalters
    12 hours ago











  • Related, Why does constructing std::string(0) not emit a compiler warning?, Access Violation when sending a 0 int literal to a const string parameter, Avoiding improper std::string initialization with NULL const char* using g++, How to best protect from 0 passed to std::string parameters?, etc.

    – jww
    17 mins ago












  • 1





    it is probably indeed passing nullptr as the parameter for a pointer

    – Tarick Welling
    13 hours ago






  • 2





    It compiles, but you get a runtime error.

    – t.niese
    13 hours ago






  • 7





    It would probably be beneficial to add a string (nullptr_t) = delete ctor, just so this error is caught at compile time. I don't think legitimate programs would break due to that.

    – MSalters
    12 hours ago











  • Related, Why does constructing std::string(0) not emit a compiler warning?, Access Violation when sending a 0 int literal to a const string parameter, Avoiding improper std::string initialization with NULL const char* using g++, How to best protect from 0 passed to std::string parameters?, etc.

    – jww
    17 mins ago







1




1





it is probably indeed passing nullptr as the parameter for a pointer

– Tarick Welling
13 hours ago





it is probably indeed passing nullptr as the parameter for a pointer

– Tarick Welling
13 hours ago




2




2





It compiles, but you get a runtime error.

– t.niese
13 hours ago





It compiles, but you get a runtime error.

– t.niese
13 hours ago




7




7





It would probably be beneficial to add a string (nullptr_t) = delete ctor, just so this error is caught at compile time. I don't think legitimate programs would break due to that.

– MSalters
12 hours ago





It would probably be beneficial to add a string (nullptr_t) = delete ctor, just so this error is caught at compile time. I don't think legitimate programs would break due to that.

– MSalters
12 hours ago













Related, Why does constructing std::string(0) not emit a compiler warning?, Access Violation when sending a 0 int literal to a const string parameter, Avoiding improper std::string initialization with NULL const char* using g++, How to best protect from 0 passed to std::string parameters?, etc.

– jww
17 mins ago





Related, Why does constructing std::string(0) not emit a compiler warning?, Access Violation when sending a 0 int literal to a const string parameter, Avoiding improper std::string initialization with NULL const char* using g++, How to best protect from 0 passed to std::string parameters?, etc.

– jww
17 mins ago












2 Answers
2






active

oldest

votes


















17














Yes, your assumption is right, checking std::basic_string constructors #5 will be called:



basic_string( const CharT* s,
const Allocator& alloc = Allocator() );


Note that passing nullptr invokes undefined behavior as stated in the standard and the notes :




The behavior is
undefined if [s, s + Traits::length(s)) is not a valid range (for
example, if s is a null pointer
).







share|improve this answer
































    8














    Why shouldn't it compile? std::string has the following constructor:



    string(const CharT* s, const Allocator& alloc = Allocator());


    that constructs the string with the contents initialized with a copy of the null-terminated character string pointed to by s. The constructor is not explicit, so the implicit conversion from nullptr to std::string is indeed possible.






    share|improve this answer




















    • 1





      Please note that passing null is UB

      – Richard Critten
      12 hours ago






    • 7





      @RichardCritten, it definitely is. But the question was why this code compiles, not what happens if the code is executed. UB will happen not only for nullptr, but for any pointer that doesn't point to the beginning of a null-terminated string.

      – Evg
      12 hours ago











    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
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f56630538%2fwhy-isnt-it-a-compile-time-error-to-return-a-nullptr-as-a-stdstring%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









    17














    Yes, your assumption is right, checking std::basic_string constructors #5 will be called:



    basic_string( const CharT* s,
    const Allocator& alloc = Allocator() );


    Note that passing nullptr invokes undefined behavior as stated in the standard and the notes :




    The behavior is
    undefined if [s, s + Traits::length(s)) is not a valid range (for
    example, if s is a null pointer
    ).







    share|improve this answer





























      17














      Yes, your assumption is right, checking std::basic_string constructors #5 will be called:



      basic_string( const CharT* s,
      const Allocator& alloc = Allocator() );


      Note that passing nullptr invokes undefined behavior as stated in the standard and the notes :




      The behavior is
      undefined if [s, s + Traits::length(s)) is not a valid range (for
      example, if s is a null pointer
      ).







      share|improve this answer



























        17












        17








        17







        Yes, your assumption is right, checking std::basic_string constructors #5 will be called:



        basic_string( const CharT* s,
        const Allocator& alloc = Allocator() );


        Note that passing nullptr invokes undefined behavior as stated in the standard and the notes :




        The behavior is
        undefined if [s, s + Traits::length(s)) is not a valid range (for
        example, if s is a null pointer
        ).







        share|improve this answer















        Yes, your assumption is right, checking std::basic_string constructors #5 will be called:



        basic_string( const CharT* s,
        const Allocator& alloc = Allocator() );


        Note that passing nullptr invokes undefined behavior as stated in the standard and the notes :




        The behavior is
        undefined if [s, s + Traits::length(s)) is not a valid range (for
        example, if s is a null pointer
        ).








        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited 13 hours ago

























        answered 13 hours ago









        Sombrero ChickenSombrero Chicken

        26.3k33484




        26.3k33484























            8














            Why shouldn't it compile? std::string has the following constructor:



            string(const CharT* s, const Allocator& alloc = Allocator());


            that constructs the string with the contents initialized with a copy of the null-terminated character string pointed to by s. The constructor is not explicit, so the implicit conversion from nullptr to std::string is indeed possible.






            share|improve this answer




















            • 1





              Please note that passing null is UB

              – Richard Critten
              12 hours ago






            • 7





              @RichardCritten, it definitely is. But the question was why this code compiles, not what happens if the code is executed. UB will happen not only for nullptr, but for any pointer that doesn't point to the beginning of a null-terminated string.

              – Evg
              12 hours ago















            8














            Why shouldn't it compile? std::string has the following constructor:



            string(const CharT* s, const Allocator& alloc = Allocator());


            that constructs the string with the contents initialized with a copy of the null-terminated character string pointed to by s. The constructor is not explicit, so the implicit conversion from nullptr to std::string is indeed possible.






            share|improve this answer




















            • 1





              Please note that passing null is UB

              – Richard Critten
              12 hours ago






            • 7





              @RichardCritten, it definitely is. But the question was why this code compiles, not what happens if the code is executed. UB will happen not only for nullptr, but for any pointer that doesn't point to the beginning of a null-terminated string.

              – Evg
              12 hours ago













            8












            8








            8







            Why shouldn't it compile? std::string has the following constructor:



            string(const CharT* s, const Allocator& alloc = Allocator());


            that constructs the string with the contents initialized with a copy of the null-terminated character string pointed to by s. The constructor is not explicit, so the implicit conversion from nullptr to std::string is indeed possible.






            share|improve this answer















            Why shouldn't it compile? std::string has the following constructor:



            string(const CharT* s, const Allocator& alloc = Allocator());


            that constructs the string with the contents initialized with a copy of the null-terminated character string pointed to by s. The constructor is not explicit, so the implicit conversion from nullptr to std::string is indeed possible.







            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited 12 hours ago

























            answered 13 hours ago









            EvgEvg

            5,56831841




            5,56831841







            • 1





              Please note that passing null is UB

              – Richard Critten
              12 hours ago






            • 7





              @RichardCritten, it definitely is. But the question was why this code compiles, not what happens if the code is executed. UB will happen not only for nullptr, but for any pointer that doesn't point to the beginning of a null-terminated string.

              – Evg
              12 hours ago












            • 1





              Please note that passing null is UB

              – Richard Critten
              12 hours ago






            • 7





              @RichardCritten, it definitely is. But the question was why this code compiles, not what happens if the code is executed. UB will happen not only for nullptr, but for any pointer that doesn't point to the beginning of a null-terminated string.

              – Evg
              12 hours ago







            1




            1





            Please note that passing null is UB

            – Richard Critten
            12 hours ago





            Please note that passing null is UB

            – Richard Critten
            12 hours ago




            7




            7





            @RichardCritten, it definitely is. But the question was why this code compiles, not what happens if the code is executed. UB will happen not only for nullptr, but for any pointer that doesn't point to the beginning of a null-terminated string.

            – Evg
            12 hours ago





            @RichardCritten, it definitely is. But the question was why this code compiles, not what happens if the code is executed. UB will happen not only for nullptr, but for any pointer that doesn't point to the beginning of a null-terminated string.

            – Evg
            12 hours ago

















            draft saved

            draft discarded
















































            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%2f56630538%2fwhy-isnt-it-a-compile-time-error-to-return-a-nullptr-as-a-stdstring%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

            Invision Community Contents History See also References External links Navigation menuProprietaryinvisioncommunity.comIPS Community ForumsIPS Community Forumsthis blog entry"License Changes, IP.Board 3.4, and the Future""Interview -- Matt Mecham of Ibforums""CEO Invision Power Board, Matt Mecham Is a Liar, Thief!"IPB License Explanation 1.3, 1.3.1, 2.0, and 2.1ArchivedSecurity Fixes, Updates And Enhancements For IPB 1.3.1Archived"New Demo Accounts - Invision Power Services"the original"New Default Skin"the original"Invision Power Board 3.0.0 and Applications Released"the original"Archived copy"the original"Perpetual licenses being done away with""Release Notes - Invision Power Services""Introducing: IPS Community Suite 4!"Invision Community Release Notes

            Canceling a color specificationRandomly assigning color to Graphics3D objects?Default color for Filling in Mathematica 9Coloring specific elements of sets with a prime modified order in an array plotHow to pick a color differing significantly from the colors already in a given color list?Detection of the text colorColor numbers based on their valueCan color schemes for use with ColorData include opacity specification?My dynamic color schemes

            Ласкавець круглолистий Зміст Опис | Поширення | Галерея | Примітки | Посилання | Навігаційне меню58171138361-22960890446Bupleurum rotundifoliumEuro+Med PlantbasePlants of the World Online — Kew ScienceGermplasm Resources Information Network (GRIN)Ласкавецькн. VI : Літери Ком — Левиправивши або дописавши її