Всем привет
вопрос почему тут разрешается двойной неявный кастинг
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
Здравствуйте, 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 неявных приведения, ошибка компиляции.
}
Здравствуйте, _nn_, Вы писали:
хорошо тогда во втором примере
ATL::CStringW f()
{
ATL::CStringA A;
return A;
}
тогда тоже одно когда вызывается
ATL::CStringA::operator PCSTR() const throw()
а потом ведь тоже вызывается консруктор для временного объекта который
возвращается или если компилятор соптимизил то вызовет конструктор
сразу для принимающего объкта
где тут два тогда ?
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.