Why is boost::optional not convertable to bool for the purposes of std::is_convertible
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;
I have
auto result = std::is_convertible
< boost::optional<int>
, bool
>::value;
static_assert( result , "task should return bool" );
and it fails to compile. The definition of std::is_convertible is
template< class From, class To > struct is_convertible;
and optional is clearly convertible to boolean because we always use it like
void(boost::optional<int> const & value)
if(value)
std::cerr << *value << endl;
what am I missing here?
c++ boost-optional
add a comment |
I have
auto result = std::is_convertible
< boost::optional<int>
, bool
>::value;
static_assert( result , "task should return bool" );
and it fails to compile. The definition of std::is_convertible is
template< class From, class To > struct is_convertible;
and optional is clearly convertible to boolean because we always use it like
void(boost::optional<int> const & value)
if(value)
std::cerr << *value << endl;
what am I missing here?
c++ boost-optional
add a comment |
I have
auto result = std::is_convertible
< boost::optional<int>
, bool
>::value;
static_assert( result , "task should return bool" );
and it fails to compile. The definition of std::is_convertible is
template< class From, class To > struct is_convertible;
and optional is clearly convertible to boolean because we always use it like
void(boost::optional<int> const & value)
if(value)
std::cerr << *value << endl;
what am I missing here?
c++ boost-optional
I have
auto result = std::is_convertible
< boost::optional<int>
, bool
>::value;
static_assert( result , "task should return bool" );
and it fails to compile. The definition of std::is_convertible is
template< class From, class To > struct is_convertible;
and optional is clearly convertible to boolean because we always use it like
void(boost::optional<int> const & value)
if(value)
std::cerr << *value << endl;
what am I missing here?
c++ boost-optional
c++ boost-optional
asked Nov 15 '18 at 12:11
bradgonesurfingbradgonesurfing
16.6k1084154
16.6k1084154
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
boost::optional
's operator bool
is explicit
. It works inside an if
's condition, because it is a contextual conversion.
You need std::is_constructible
, which tries to perform an explicit conversion.
The following compiles
static_assert
( std::is_constructible<bool, boost::optional<int>>::value
, "msg" );
and the following fails to compile because optional is not convertible to int
static_assert
( std::is_constructible<int, boost::optional<int>>::value
, "msg" );
Could you please elaborate on how to use std::is_constructible to detect if I can convert the type to bool? I'm not sure how to go about it.
– bradgonesurfing
Nov 15 '18 at 12:25
@bradgonesurfing There's a gotcha in that the arguments are reversed compared tostd::is_convertible
, but it should be as simple asstd::is_constructible<bool, boost::optional<int>>
.
– Quentin
Nov 15 '18 at 12:26
1
Thanks @quentin I added the examples to the answer so it's clear to the next person coming this way :)
– bradgonesurfing
Nov 15 '18 at 12:32
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%2f53319240%2fwhy-is-boostoptionalt-not-convertable-to-bool-for-the-purposes-of-stdis-co%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
boost::optional
's operator bool
is explicit
. It works inside an if
's condition, because it is a contextual conversion.
You need std::is_constructible
, which tries to perform an explicit conversion.
The following compiles
static_assert
( std::is_constructible<bool, boost::optional<int>>::value
, "msg" );
and the following fails to compile because optional is not convertible to int
static_assert
( std::is_constructible<int, boost::optional<int>>::value
, "msg" );
Could you please elaborate on how to use std::is_constructible to detect if I can convert the type to bool? I'm not sure how to go about it.
– bradgonesurfing
Nov 15 '18 at 12:25
@bradgonesurfing There's a gotcha in that the arguments are reversed compared tostd::is_convertible
, but it should be as simple asstd::is_constructible<bool, boost::optional<int>>
.
– Quentin
Nov 15 '18 at 12:26
1
Thanks @quentin I added the examples to the answer so it's clear to the next person coming this way :)
– bradgonesurfing
Nov 15 '18 at 12:32
add a comment |
boost::optional
's operator bool
is explicit
. It works inside an if
's condition, because it is a contextual conversion.
You need std::is_constructible
, which tries to perform an explicit conversion.
The following compiles
static_assert
( std::is_constructible<bool, boost::optional<int>>::value
, "msg" );
and the following fails to compile because optional is not convertible to int
static_assert
( std::is_constructible<int, boost::optional<int>>::value
, "msg" );
Could you please elaborate on how to use std::is_constructible to detect if I can convert the type to bool? I'm not sure how to go about it.
– bradgonesurfing
Nov 15 '18 at 12:25
@bradgonesurfing There's a gotcha in that the arguments are reversed compared tostd::is_convertible
, but it should be as simple asstd::is_constructible<bool, boost::optional<int>>
.
– Quentin
Nov 15 '18 at 12:26
1
Thanks @quentin I added the examples to the answer so it's clear to the next person coming this way :)
– bradgonesurfing
Nov 15 '18 at 12:32
add a comment |
boost::optional
's operator bool
is explicit
. It works inside an if
's condition, because it is a contextual conversion.
You need std::is_constructible
, which tries to perform an explicit conversion.
The following compiles
static_assert
( std::is_constructible<bool, boost::optional<int>>::value
, "msg" );
and the following fails to compile because optional is not convertible to int
static_assert
( std::is_constructible<int, boost::optional<int>>::value
, "msg" );
boost::optional
's operator bool
is explicit
. It works inside an if
's condition, because it is a contextual conversion.
You need std::is_constructible
, which tries to perform an explicit conversion.
The following compiles
static_assert
( std::is_constructible<bool, boost::optional<int>>::value
, "msg" );
and the following fails to compile because optional is not convertible to int
static_assert
( std::is_constructible<int, boost::optional<int>>::value
, "msg" );
edited Nov 15 '18 at 12:31
bradgonesurfing
16.6k1084154
16.6k1084154
answered Nov 15 '18 at 12:19
QuentinQuentin
47.1k692148
47.1k692148
Could you please elaborate on how to use std::is_constructible to detect if I can convert the type to bool? I'm not sure how to go about it.
– bradgonesurfing
Nov 15 '18 at 12:25
@bradgonesurfing There's a gotcha in that the arguments are reversed compared tostd::is_convertible
, but it should be as simple asstd::is_constructible<bool, boost::optional<int>>
.
– Quentin
Nov 15 '18 at 12:26
1
Thanks @quentin I added the examples to the answer so it's clear to the next person coming this way :)
– bradgonesurfing
Nov 15 '18 at 12:32
add a comment |
Could you please elaborate on how to use std::is_constructible to detect if I can convert the type to bool? I'm not sure how to go about it.
– bradgonesurfing
Nov 15 '18 at 12:25
@bradgonesurfing There's a gotcha in that the arguments are reversed compared tostd::is_convertible
, but it should be as simple asstd::is_constructible<bool, boost::optional<int>>
.
– Quentin
Nov 15 '18 at 12:26
1
Thanks @quentin I added the examples to the answer so it's clear to the next person coming this way :)
– bradgonesurfing
Nov 15 '18 at 12:32
Could you please elaborate on how to use std::is_constructible to detect if I can convert the type to bool? I'm not sure how to go about it.
– bradgonesurfing
Nov 15 '18 at 12:25
Could you please elaborate on how to use std::is_constructible to detect if I can convert the type to bool? I'm not sure how to go about it.
– bradgonesurfing
Nov 15 '18 at 12:25
@bradgonesurfing There's a gotcha in that the arguments are reversed compared to
std::is_convertible
, but it should be as simple as std::is_constructible<bool, boost::optional<int>>
.– Quentin
Nov 15 '18 at 12:26
@bradgonesurfing There's a gotcha in that the arguments are reversed compared to
std::is_convertible
, but it should be as simple as std::is_constructible<bool, boost::optional<int>>
.– Quentin
Nov 15 '18 at 12:26
1
1
Thanks @quentin I added the examples to the answer so it's clear to the next person coming this way :)
– bradgonesurfing
Nov 15 '18 at 12:32
Thanks @quentin I added the examples to the answer so it's clear to the next person coming this way :)
– bradgonesurfing
Nov 15 '18 at 12:32
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%2f53319240%2fwhy-is-boostoptionalt-not-convertable-to-bool-for-the-purposes-of-stdis-co%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