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;
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
add a comment |
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
1
it is probably indeed passingnullptr
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 astring (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
add a comment |
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
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
c++ function language-lawyer stdstring
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 passingnullptr
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 astring (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
add a comment |
1
it is probably indeed passingnullptr
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 astring (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
add a comment |
2 Answers
2
active
oldest
votes
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, ifs
is a null pointer).
add a comment |
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.
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 fornullptr
, but for any pointer that doesn't point to the beginning of a null-terminated string.
– Evg
Jun 17 at 12:13
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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, ifs
is a null pointer).
add a comment |
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, ifs
is a null pointer).
add a comment |
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, ifs
is a null pointer).
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, ifs
is a null pointer).
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
add a comment |
add a comment |
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.
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 fornullptr
, but for any pointer that doesn't point to the beginning of a null-terminated string.
– Evg
Jun 17 at 12:13
add a comment |
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.
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 fornullptr
, but for any pointer that doesn't point to the beginning of a null-terminated string.
– Evg
Jun 17 at 12:13
add a comment |
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.
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.
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 fornullptr
, but for any pointer that doesn't point to the beginning of a null-terminated string.
– Evg
Jun 17 at 12:13
add a comment |
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 fornullptr
, 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
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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