Правильно ли приведение в стиле c, вызывающее явный конструктор преобразования?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Правильно ли приведение в стиле c, вызывающее явный конструктор преобразования?

Сообщение Anonymous »

Может ли приведение в стиле c вызвать явный конструктор преобразования?

Рассмотрим следующий код:

Код: Выделить всё

class Vec3
{
public:

explicit Vec3(float All)
: X(All), Y(All), Z(All)
{
}

Vec3(float InX, float InY, float InZ)
: X(InX), Y(InY), Z(InZ)
{
}

Vec3()
: X(0), Y(0), Z(0)
{
}

float X, Y, Z;
};

void Morph(const Vec3& In, Vec3& Out)
{
Out = In;
}

int main(void)
{
float Array[3] = {1.0f, 2.0f, 3.0f};
Vec3 Morphed;
Morph((const Vec3&)Array[0], Morphed);
}
В компиляторе Microsoft VS2010 он преобразует строку (const Vec3&)Array[0] в reinterpret_cast и конструктор копирования для передачи параметра в функцию . Morphed получает значение [1.0f, 2.0f, 3.0f].

В другом компиляторе стороннего производителя он преобразует (const Vec3&)Array[0]< /code> для явного вызова Vec3(float), а затем конструктора копирования для передачи параметра в функцию. Morphed получает значение [1.0f, 1.0f, 1.0f].

Я проверил это, посмотрев дизассемблирование обоих компиляторов:

VS2010:

Код: Выделить всё

   483:     float Array[3] = {1.0f, 2.0f, 3.0f};
0000000143E68049  movss       xmm0,dword ptr [__real@3f800000 (145DA1F18h)]
0000000143E68051  movss       dword ptr [rsp+28h],xmm0
0000000143E68057  movss       xmm0,dword ptr [__real@40000000 (145DC9704h)]
0000000143E6805F  movss       dword ptr [rsp+2Ch],xmm0
0000000143E68065  movss       xmm0,dword ptr [__real@40400000 (145DC9708h)]
0000000143E6806D  movss       dword ptr [rsp+30h],xmm0
484:     Vec3 Morphed;
0000000143E68073  xorps       xmm0,xmm0
0000000143E68076  movss       dword ptr [rsp+58h],xmm0
0000000143E6807C  xorps       xmm0,xmm0
0000000143E6807F  movss       dword ptr [rsp+5Ch],xmm0
0000000143E68085  xorps       xmm0,xmm0
0000000143E68088  movss       dword ptr [rsp+60h],xmm0
485:     Morph((const Vec3&)Array[0], Morphed);
0000000143E6808E  lea         rdx,[rsp+58h]
0000000143E68093  lea         rcx,[rsp+28h]
0000000143E68098  call        Morph (143E67FB0h)
Другой компилятор:

Код: Выделить всё

   184:     float Array[3] {1.0f, 2.0f, 3.0f};
0000000001E1F3B0  mov          rax,qword ptr [000000000432D1B0h]
0000000001E1F3B7  mov          qword ptr [rbp-14h],rax
0000000001E1F3BB  mov          edi,dword ptr [000000000432D1B8h]
0000000001E1F3C1  mov          dword ptr [rbp-0Ch],edi
185:     Vec3 Morphed;
0000000001E1F3C4  lea          rdi,[rbp-130h]
0000000001E1F3CB  call         Vec3::Vec3() (0000000003C119C0h)
186:     Morph((const Vec3&)Array[0], Morphed);
0000000001E1F3D0  lea          rdi,[rbp-140h]
0000000001E1F3D7  vmovss       xmm0,dword ptr [rbp-14h]
0000000001E1F3DC  call         Vec3::Vec3(float) (0000000003C119E0h)
0000000001E1F3E1  lea          rdi,[rbp-140h]
0000000001E1F3E8  lea          rsi,[rbp-130h]
0000000001E1F3EF  call         Morph(Vec3 const&,Vec3&) (0000000001E1F350h)
Излишне говорить, что это вызывает множество проблем. Какой компилятор правильный? Сторонний код основан на реализации Microsoft, но мы компилируем его с помощью другого компилятора для другой платформы.

Подробнее здесь: https://stackoverflow.com/questions/185 ... or-correct
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»