I have a function whose signature is:
void func(std::optional<std::string> os = std::nullopt);
(I’m aliasing std::experimental::optional
until std::optional
is officially available.)
However, I’m having difficulty calling it cleanly. The compiler will refuse to perform two implicit conversions (const char*
➝ std::string
➝ std::optional<std::string>
) to call it with a raw C-string literal. I can do this:
func(std::string("Hello"));
And the compiler will figure that a std::optional
is needed, and do the conversion. However, this is way too verbose. Thanks to C++11, I can also do this:
func({"Hello"});
While this is way better, it's still not ideal. I'd like to be able to call this function like any other that takes a std::string
. Is this possible? Making the function take another parameter type is okay, as long as it behaves similarly to/is directly convertible to std::optional
. Thanks.
std::string
parameter? – Trinaryvoid func(std::optional<std::string> os = std::nullopt)
,void func(std::string s)
andvoid func()
. The latter two would call the former, constructing the optional as appropriate. I’d be happy if you could prove me wrong. While this does technically work, there’s just a lot of unnecessary interface code. Thanks, though. – Sammonsfunc("std::string literal"s);
okay? – Vernonvernorfunc()
if there's a default argument forfunc(std::optional<std::string> = std::nullopt)
? – Gilbyestd::experimental::optional
, see LWG DR 2451. There's no error withstd::optional
, nor with GCC'sstd::experimental::optional
, but not all implementations have the fix for the DR. If you were really usingstd::optional
and not faking it withstd::experimental::optional
there would be no error. – Gilbye