Пишу программу под MS Visual C++ 6.0 (да, я знаю, что она древняя, нет ничего не могу обновить). Я вижу какое-то поведение, которое я считаю действительно странным. У меня есть класс с двумя конструкторами, определенными следующим образом:
class MyClass
{
public:
explicit MyClass(bool bAbsolute = true, bool bLocation = false) : m_bAbsolute(bAbsolute), m_bLocation(bLocation) { ; }
MyClass(const RWCString& strPath, bool bLocation = false);
private:
bool m_bAbsolute;
bool m_bLocation;
};
Когда я создаю экземпляр этого класса с таким синтаксисом: MyClass("blah")
, он вызывает первый конструктор. Как вы видите, я добавил к нему ключевое слово explicit
в надежде, что он этого не сделает... нет костей. Казалось бы, преобразование из const char *
в bool
предпочтительнее преобразования в RWCString
, у которого есть конструктор копирования, который принимает const char *
. Почему это происходит? Я бы предположил, что с учетом двух возможных вариантов, подобных этому, он бы сказал, что это неоднозначно. Что я могу сделать, чтобы предотвратить это? Если это вообще возможно, я бы хотел избежать явного приведения аргумента strPath
к RWCString
, так как он будет часто использоваться с литералами, а это много лишнего ввода (плюс действительно легко сделать ошибку).