Его также полезно (dangerious), потому что он может автоматически преобразовывать аргументы.
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?
}
'std :: string s =" hello world ";' В таких случаях, как строки, более естественно использовать конструктор преобразования. Некоторые функции внедряются только для того, чтобы сделать синтаксис более приятным. – andre
или 'ComplexNumber c = 5;' – Andrew
Это также полезно, если у вас есть класс, который действует как число или значение. Например, высокоточный класс чисел, который вы можете преобразовать из int. –