在阅读了转换构造函数后,我得出结论,它只是一个只有一个参数的类构造函数。这个页面解释了很多但是我仍然对它的使用感到困惑。为什么使用它?到目前为止,我所理解的是,而不是像这样声明一个实例
someclass a(12);
我们可以这样做
someclass a = 12;
它也很有用(危险),因为它可以自动转换参数。
void print(std::string const& str)
{
std::cout << str << "\n";
}
int main()
{
print("Hi"); // That's not a string.
// But the compiler spots that std::string has a single
// argument constructor that it can use to convert a
// `char const*` into a std::string with.
}
它基本上是为了使语言更易于编写(阅读)。
有一个不幸的副作用(他们在事后发现)。编译器会自动转换你可能不想转换的东西。一时想不出来。但它们存在。结果,他们explicit
为构造函数添加了关键字。这可以防止自动编译器转换(因为您需要显式调用它)。
谢谢@Mooing Duck
int main()
{
std::vector<int> names = 3; // What does this mean?
// This does not compile because of the explicit keyword now.
// But it used to compile and the meaning is not obvious.
// It gets even worse if you think about a function that takes a vector
plop(3); // Do you want that to auto converted into an std::vector<int>?
// Would you not want a compiler error?
}
如果你有一个转换构造函数
SomeClass( int )
这意味着一个函数
void foo( SomeClass x );
可以通过调用来满足
foo( 12 );
这可能是也可能不是您想要的。explicit
关键字是为了避免这种“令人惊讶的”转换。
当您想要进行隐式转换时,它会变得很有用。例如
struct A {
A(int i) : i(i) {}
A() : A(0) {}
int i;
A operator+(const A& a) {
return A(i + a.i);
}
};
void f(A a) {}
int main() {
A a(1);
A c = a + 2; // This wont be possible with out the implicit conversion of 2 to A
f(3); // This wont be possible with out the implicit conversion of 3 to A
}