请考虑:
struct Foo
{
Foo(std::string str) {}
};
struct Bar
{
Bar(Foo f) {}
};
int main(int argc, char* argv[])
{
Foo f("test");
Bar b1(f);
Bar b2(std::string("test"));
Bar b3("test");
return 0;
}
在b3声明时会编译失败('不能将参数1从 'const char [5]' 转换为 'Foo''),这是有道理的,因为没有直接将const char转换为Foo的方法。然而,有一种方式可以将const char转换为std::string,然后使用它来构造一个Foo(这就是b1和b2中发生的情况),这正是我想要的,因为它使API更易于使用(不需要每次都显式实例化Foo或std::string)。
所以我的问题是:是否有办法让编译器隐式调用Foo(std::string)复制构造函数?换句话说,是否有一种让像b3那样的声明工作的方法,让它与b2相同,并且不需要为Foo声明const char*复制构造函数?(最后一件事是显然的,但我的真实代码当然不像这么简单,而且我宁愿不添加const char *复制构造函数,并正确处理所有其他初始化,保持它们与std::string复制构造函数的同步)。
const char*
到std::string
,然后从std::string
到Foo
)。解决方法之一是添加一个以const char*
为参数的Foo
构造函数重载。 - Igor Tandetnik