i have following function
template <typename t, typename u> const t* visitor_fct(u& operand) { return (boost::get<t>(&operand)); }
when do
boost::variant<int, std::string> str = "string"; std::cout << visitor_fct<std::string>(str) << std::endl;
i correct output
but when change declaration of str :
boost::variant<int, std::string, bool> str = "toto";
i getting nullptr
;
why ?
the reason string literal (char*
)converts bool
better std::string
string literal doesn't initialize string
component of variant, rather bool
component (to true).
see following outputs bool 1
:
#include <iostream> void foo(bool b) { std::cout << "bool " << b << std::endl; } void foo(std::string s) { std::cout << "string " << s << std::endl; } int main() { foo("bar"); }
initializing std::string("toto")
solve problem.
4.12/1 shows conversion in question:
a prvalue of arithmetic, unscoped enumeration, pointer, or pointer member type can converted prvalue of type bool. 0 value, null pointer value, or null member pointer value converted false; other value converted true. prvalue of type std::nullptr_t can converted prvalue of type bool; resulting value false.
[as noted in other answer] implicit conversion takes precedence on converting constructor of std::string
, selected, causing type used in variant bool
.
Comments
Post a Comment