这些工作:
struct WithString {
WithString(std::string){};
};
void takeString(std::string){}
//implicit conversions:
takeString("hello");
WithString("hello");
但这不会:
WithString makeWithString() { return "hello";}
// error: no viable conversion from returned value of type 'const char [6]'...
如果“hello”在前两种情况下被隐式转换为std::string
,为什么不能在最后一种情况下呢?请注意,我没有将WithString
构造函数指定为explicit
,所以我期望这样的转换。
我可以通过这样做使行为起作用:
struct WithString {
WithString(std::string){};
WithString(const char *){};
};
我只是对这个奇怪的东西感到好奇。如果我假设一个猜测,我会说这是因为在前两个工作情况下,转换是在const char *
to之间std::string
,但在错误情况下,这将需要一个 2 转换链,首先是 from const char *
to std::string
,然后是 from std::string
to WithString
。所以也许这就是原因,但我不确定。