Я пишу программу под 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
, так как он будет часто использоваться с литералами, и это очень много дополнительной типизации (плюс действительно простая ошибка сделать).