C++ 双重转换可以解决这个问题,但C++;,正确的?

C++ 双重转换可以解决这个问题,但C++;,正确的?,c++,C++,我有这样的东西 void f(dclass b); class dclass { dclass(string s); }; f("s"); 这似乎不起作用。原则上,它可以使用双重转换:char*->string->dclass 所以C++中没有这样的东西。或者有些编译器支持它。。。您知道一种可能的语言吗?一个链中可以有多个转换,但是链中最多可以有一个用户定义的转换。在这种情况下,const char*->std::string和std::string->dclass都是用户定义的转

我有这样的东西

void f(dclass b);

class dclass
{
    dclass(string s);
};

f("s");
这似乎不起作用。原则上,它可以使用双重转换:
char*->string->dclass


<>所以C++中没有这样的东西。或者有些编译器支持它。。。您知道一种可能的语言吗?

一个链中可以有多个转换,但是链中最多可以有一个用户定义的转换。在这种情况下,
const char*
->
std::string
std::string
->
dclass
都是用户定义的转换。要解决这个问题,您需要添加一个隐式构造函数,该构造函数接受
常量char*
。当然,如果您考虑了隐式构造函数的所有不希望的影响

class dclass
{
    dclass(string s);
    dclass(const char* ps);
};

这是可能的,但这在重载语言中是行不通的。将O(N)重载解析转换为O(N*M)重载解析。一般来说,重载被认为是比多次用户定义转换更有价值的语言功能。

为了完整起见,您可以这样调用函数:

f(dclass("s"));

你认为这应该做什么?它实际上在做什么?为什么不写一个
dclass(constchar*)?我想你可以说这在Java中是可能的,因为Java没有
char*
,所有的字符串都是
String
…是的,我做到了。。只是想知道你的想法。@Aftershock:N=重载的数量,M=用户定义类型的数量;重载解析必须查看所有这些,以查看是否有可用的双转换。Mike是对的。请注意,N和M都可能包含模板实例化(在C++中),这确实会使这项工作非常昂贵。