implicit casting
От: jyuyjiyuijyu  
Дата: 30.07.11 14:09
Оценка:
Всем привет
вопрос почему тут разрешается двойной неявный кастинг
ATL::CStringA A;
ATL::CStringW W(A);

вначале вызывается operator для CStringA
ATL::CStringA::operator PCSTR() const throw()

а потом конструктор CStringW
ATL::CStringW::CStringW( _In_opt_z_ const CHAR* pszSrc )

немного изменив код
ATL::CStringW f()
{
    ATL::CStringA A;
    return A;
}

тут как я понимаю он теже действия должен сделать но
выдет warning C4927: illegal conversion; more than one user-defined conversion has been implicitly applied
а почему тогда первый код нормально компилирует а тут ему уже не нравится двойной кастинг ?
третий прмиер
void g(ATL::CStringW W)
{
}
ATL::CStringA A;
g(A);

тут вообще отказывается компилировать "без комментариев"
error C2664: 'g' : cannot convert parameter 1 from 'ATL::CStringA' to 'ATL::CStringW'
чем эти прмеры принципиально отличаются ? почему такой разброс ошибок на одинаковом коде ?
компилер cl.exe 15.0
Re: implicit casting
От: _nn_ www.nemerleweb.com
Дата: 30.07.11 15:01
Оценка: 1 (1)
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>Всем привет

J>вопрос почему тут разрешается двойной неявный кастинг
J>
J>ATL::CStringA A;
J>ATL::CStringW W(A);
J>

J>вначале вызывается operator для CStringA
J>
J>ATL::CStringA::operator PCSTR() const throw()
J>

J>а потом конструктор CStringW
J>
J>ATL::CStringW::CStringW( _In_opt_z_ const CHAR* pszSrc )
J>


Все вы же сами понимаете что здесь только одно неявное приведение типа, а конструктор это другое.

struct a { operator int() { return 1; } };

struct b { operator a() { return a(); } };

int main()
{
  b p;
 
  a q;
  q = p; // OK

  int w;
  w = static_cast<a>(p);  // OK. явное приведение + неявное

  int e;
  e = p; // 2 неявных приведения, ошибка компиляции.
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: implicit casting
От: jyuyjiyuijyu  
Дата: 30.07.11 15:20
Оценка:
Здравствуйте, _nn_, Вы писали:

хорошо тогда во втором примере
ATL::CStringW f()
{
    ATL::CStringA A;
    return A;
}

тогда тоже одно когда вызывается
 
ATL::CStringA::operator PCSTR() const throw()

а потом ведь тоже вызывается консруктор для временного объекта который
возвращается или если компилятор соптимизил то вызовет конструктор
сразу для принимающего объкта

где тут два тогда ?
Re: implicit casting
От: Masterkent  
Дата: 30.07.11 15:47
Оценка: 1 (1)
jyuyjiyuijyu:

J>Всем привет

J>вопрос почему тут разрешается двойной неявный кастинг
J>
J>ATL::CStringA A;
J>ATL::CStringW W(A);
J>

J>вначале вызывается operator для CStringA
J>
J>ATL::CStringA::operator PCSTR() const throw()
J>

J>а потом конструктор CStringW
J>
J>ATL::CStringW::CStringW( _In_opt_z_ const CHAR* pszSrc )
J>

Вызов конструктора к неявному преобразованию не относится.

J>немного изменив код

J>
J>ATL::CStringW f()
J>{
J>    ATL::CStringA A;
J>    return A;
J>}
J>

J>тут как я понимаю он теже действия должен сделать

Не те же. В первом случае имеет место direct-initialization, а во втором — copy-initialization. Правила для них разные — см. C++03 — 8.5/14.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.