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

What is the olden name for sideburns?

What speedlites can work with the Canon EOS 4000D's non-standard hotshoe?

Does a centaur PC also count as being mounted?

Do sudoku answers always have a single minimal clue set?

Polish letters in ASME English template

Should I tell my insurance company I have an unsecured loan for my new car?

Set vertical spacing between two particular items

In native German words, is Q always followed by U, as in English?

Zombie diet, why humans?

How can I check type T is among parameter pack Ts... in C++?

How do I find and plot the intersection of these three surfaces?

Golf the smallest circle!

ArcGIS Intersect Tool not splitting lines as expected?

Analog is Obtuse!

Could Sauron have read Tom Bombadil's mind if Tom had held the Palantir?

The difference between Rad1 and Rfd1

Anagram Within an Anagram!

Quacks of Quedlingburg Crow Skull Set 2 Keep Drawing

How to determine what is the correct level of detail when modelling?

How fast can a ship with rotating habitats be accelerated?

What does 行けそうなら mean?

Spicket or spigot?

Can a US President have someone sent to prison?

Should I hide continue button until tasks are completed?



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 margin-bottom:0;








22















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
    Jun 17 at 11:42






  • 2





    It compiles, but you get a runtime error.

    – t.niese
    Jun 17 at 11:42






  • 15





    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
    Jun 17 at 12:03











  • 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
    Jun 18 at 0:37

















22















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
    Jun 17 at 11:42






  • 2





    It compiles, but you get a runtime error.

    – t.niese
    Jun 17 at 11:42






  • 15





    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
    Jun 17 at 12:03











  • 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
    Jun 18 at 0:37













22












22








22


1






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++ function language-lawyer stdstring






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jun 18 at 6:29









Marc.2377

2,4353 gold badges23 silver badges57 bronze badges




2,4353 gold badges23 silver badges57 bronze badges










asked Jun 17 at 11:38









TaronTaron

5505 silver badges23 bronze badges




5505 silver badges23 bronze badges







  • 1





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

    – Tarick Welling
    Jun 17 at 11:42






  • 2





    It compiles, but you get a runtime error.

    – t.niese
    Jun 17 at 11:42






  • 15





    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
    Jun 17 at 12:03











  • 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
    Jun 18 at 0:37












  • 1





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

    – Tarick Welling
    Jun 17 at 11:42






  • 2





    It compiles, but you get a runtime error.

    – t.niese
    Jun 17 at 11:42






  • 15





    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
    Jun 17 at 12:03











  • 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
    Jun 18 at 0:37







1




1





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

– Tarick Welling
Jun 17 at 11:42





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

– Tarick Welling
Jun 17 at 11:42




2




2





It compiles, but you get a runtime error.

– t.niese
Jun 17 at 11:42





It compiles, but you get a runtime error.

– t.niese
Jun 17 at 11:42




15




15





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
Jun 17 at 12:03





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
Jun 17 at 12:03













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
Jun 18 at 0:37





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
Jun 18 at 0:37












2 Answers
2






active

oldest

votes


















24














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
































    13














    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
      Jun 17 at 11:59






    • 16





      @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
      Jun 17 at 12:13













    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









    24














    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





























      24














      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



























        24












        24








        24







        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 Jun 17 at 11:53

























        answered Jun 17 at 11:43









        Sombrero ChickenSombrero Chicken

        26.5k3 gold badges35 silver badges84 bronze badges




        26.5k3 gold badges35 silver badges84 bronze badges























            13














            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
              Jun 17 at 11:59






            • 16





              @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
              Jun 17 at 12:13















            13














            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
              Jun 17 at 11:59






            • 16





              @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
              Jun 17 at 12:13













            13












            13








            13







            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 Jun 17 at 12:16

























            answered Jun 17 at 11:42









            EvgEvg

            5,8003 gold badges19 silver badges43 bronze badges




            5,8003 gold badges19 silver badges43 bronze badges







            • 1





              Please note that passing null is UB

              – Richard Critten
              Jun 17 at 11:59






            • 16





              @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
              Jun 17 at 12:13












            • 1





              Please note that passing null is UB

              – Richard Critten
              Jun 17 at 11:59






            • 16





              @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
              Jun 17 at 12:13







            1




            1





            Please note that passing null is UB

            – Richard Critten
            Jun 17 at 11:59





            Please note that passing null is UB

            – Richard Critten
            Jun 17 at 11:59




            16




            16





            @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
            Jun 17 at 12:13





            @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
            Jun 17 at 12:13

















            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

            Category:9 (number) SubcategoriesMedia in category "9 (number)"Navigation menuUpload mediaGND ID: 4485639-8Library of Congress authority ID: sh85091979ReasonatorScholiaStatistics

            Circuit construction for execution of conditional statements using least significant bitHow are two different registers being used as “control”?How exactly is the stated composite state of the two registers being produced using the $R_zz$ controlled rotations?Efficiently performing controlled rotations in HHLWould this quantum algorithm implementation work?How to prepare a superposed states of odd integers from $1$ to $sqrtN$?Why is this implementation of the order finding algorithm not working?Circuit construction for Hamiltonian simulationHow can I invert the least significant bit of a certain term of a superposed state?Implementing an oracleImplementing a controlled sum operation

            Magento 2 “No Payment Methods” in Admin New OrderHow to integrate Paypal Express Checkout with the Magento APIMagento 1.5 - Sales > Order > edit order and shipping methods disappearAuto Invoice Check/Money Order Payment methodAdd more simple payment methods?Shipping methods not showingWhat should I do to change payment methods if changing the configuration has no effects?1.9 - No Payment Methods showing upMy Payment Methods not Showing for downloadable/virtual product when checkout?Magento2 API to access internal payment methodHow to call an existing payment methods in the registration form?