Несколько комментариев по моему недавнему ответу, Какие другие полезные приведения могут быть использованы в С++, свидетельствуют о том, что мое понимание конверсий на С++ ошибочно. Чтобы прояснить эту проблему, рассмотрите следующий код:
#include <string>
struct A {
A( const std::string & s ) {}
};
void func( const A & a ) {
}
int main() {
func( "one" ); // error
func( A("two") ); // ok
func( std::string("three") ); // ok
}
Мое утверждение состояло в том, что первый вызов функции является ошибкой, потому что нет никакого преобразования из const char * в A. Существует преобразование из строки в A, но использование этого будет включать в себя больше, чем один конвертация. Я понимаю, что это недопустимо, и это, похоже, подтверждается компиляторами g++ 4.4.0 и Comeau. С Comeau я получаю следующую ошибку:
"ComeauTest.c", line 11: error: no suitable constructor exists
to convert from "const char [4]" to "A"
func( "one" ); // error
Если вы можете указать, где я ошибаюсь, либо здесь, либо в исходном ответе, желательно со ссылкой на стандарт С++, сделайте это.
И ответ со стандартом С++ выглядит следующим образом:
Не более одного пользовательского преобразования (функция конструктора или преобразования) неявно применяется к одному значению.
Спасибо Абхай за предоставление цитаты.