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

            Get product attribute by attribute group code in magento 2get product attribute by product attribute group in magento 2Magento 2 Log Bundle Product Data in List Page?How to get all product attribute of a attribute group of Default attribute set?Magento 2.1 Create a filter in the product grid by new attributeMagento 2 : Get Product Attribute values By GroupMagento 2 How to get all existing values for one attributeMagento 2 get custom attribute of a single product inside a pluginMagento 2.3 How to get all the Multi Source Inventory (MSI) locations collection in custom module?Magento2: how to develop rest API to get new productsGet product attribute by attribute group code ( [attribute_group_code] ) in magento 2

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

            Magento 2.3: How do i solve this, Not registered handle, on custom form?How can i rewrite TierPrice Block in Magento2magento 2 captcha not rendering if I override layout xmlmain.CRITICAL: Plugin class doesn't existMagento 2 : Problem while adding custom button order view page?Magento 2.2.5: Overriding Admin Controller sales/orderMagento 2.2.5: Add, Update and Delete existing products Custom OptionsMagento 2.3 : File Upload issue in UI Component FormMagento2 Not registered handleHow to configured Form Builder Js in my custom magento 2.3.0 module?Magento 2.3. How to create image upload field in an admin form