Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Двойная вложенность конструктора


Автор: borisbn 27.7.2011, 10:19
Плохое название получилось... ну да ладно
Добрый день. Натолкнулся на такую ошибку
Код

struct iX {
  iX( const int & i ) {} 
};
struct iY {
  iY( const iX & x ){}
};

struct sX {
  sX( const std::string & s ) {}
};
struct sY {
  sY( const sX & x ){}
};

iX ix( 1 ); // ok
iY iy( 1 ); // ok

const char * const c = "q";

sX sx( c ); // ok
sY sy( c ); // error: no matching function for call to 'sY::sY(const char* const&)'
// note: candidates are:
// note: sY::sY(const sX&)
// no known conversion for argument 1 from 'const char* const' to 'const sX&'

http://liveworkspace.org/code/e8bf4aceeafde5f52d5efd551d7530df

вот и не могу понять, почему в случае с int всё работает, а в случае с std::string - нет ?
Спасибо.

Автор: azesmcar 27.7.2011, 10:34
borisbn

Потому что в одном случае ты передаешь int, а в другом const char*. Попробуй так
Код

const std::string c = "q";

Автор: borisbn 27.7.2011, 11:04
хммм. а почему тогда это
Код
double d = 1.5;
iY iy( d );

не вызывает ошибки ?
http://liveworkspace.org/code/64ac8f75e8ef0861b3d9a8966cc1e5e2

Автор: Earnest 27.7.2011, 11:05
Преобразование встроенных типов, а в случае string - уже пользовательские.

Автор: borisbn 27.7.2011, 11:09
Earnest, ну, это-то понятно. Или Вы хотите сказать, что это по стандарту ? Не подскажете, где там это найти ( хотя бы примерно smile )

Автор: mes 27.7.2011, 11:49
Цитата(borisbn @  27.7.2011,  10:09 Найти цитируемый пост)
, где там это найти

Если я правильно понял что Вы хотите найти, то 13.3.3.1 и 13.3.3.2.. но они тянут за собой еще кучу, так что если читать, то придется основательно выделить время smile



Автор: borisbn 27.7.2011, 15:33
Цитата(mes @  27.7.2011,  11:49 Найти цитируемый пост)
Если я правильно понял что Вы хотите найти, то 13.3.3.1 и 13.3.3.2..

mes, спасибо ! Поняли правильно. И пункты правильные. Кажется понял:

Первое утверждение
Цитата

A well-formed implicit conversion sequence is one of the following forms:
— a standard conversion sequence (13.3.3.1.1),
— a user-defined conversion sequence (13.3.3.1.2), or
— an ellipsis conversion sequence (13.3.3.1.3).

Указанный мной метод подпадает под user-defined conversion (а именно под 12.3.1 Conversion by constructor)
далее
Цитата

4 However, when considering the argument of a user-defined conversion function that is a candidate by 13.3.1.3 when
invoked for the copying of the temporary in the second step of a class copy-initialization, or by 13.3.1.4, 13.3.1.5, or
13.3.1.6 in all cases, only standard conversion sequences and ellipsis conversion sequences are allowed.

(в 13.3.1.3 как раз говорится про converting constructors)
таким образом, получается, что если пытаться конвертировать параметры через конструктор, то это можно делать через standard conversion sequences (для простых типов. для нашего случая - не подходит) или через ellipsis (...) - тоже не подходит... Т.е. - нельзя.
Всем спасибо. Закрываю.

Добавлено через 9 минут и 59 секунд
Интересно, за что мне проголосовали в минус в сообщении
Цитата(borisbn @  27.7.2011,  11:09 Найти цитируемый пост)
Или Вы хотите сказать, что это по стандарту ? Не подскажете, где там это найти


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)