Ошибка: невозможно использовать vector unsigned long long[2] для инициализации vector unsigned long long[2]

Мы тестируем под Sun Studio 12.3. Мы обнаруживаем ошибку компилятора, которой нет в 12.4 и более поздних версиях. Его нет в 12.1 и более ранних версиях, но это потому, что у компилятора проблемы с инструкциями AES. Его также нет в других компиляторах, таких как Clang, GCC, ICPC и VC++. Ошибка:

/opt/solarisstudio12.3/bin/CC -DDEBUG -g3 -xO0 -D__SSE2__ -D__SSE3__ -D__SSSE3__ \
-D__SSE4_1__ -D__SSE4
std::swap(*(__m128i*)(rk), *(__m128i*)(rk+4*m_rounds));
_ -D__AES__ -D__PCLMUL__ -D__RDRND__ -D__RDSEED__ -D__AVX__ \ -D__AVX2__ -D__BMI__ -D__BMI2__ -native -m64 -KPIC -template=no%extdef -c rijndael.cpp "/opt/solarisstudio12.3/prod/include/CC/Cstd/algorithm", line 283: Error: Cannot use vector unsigned long long[2] to initialize vector unsigned long long[2]. "rijndael.cpp", line 277: Where: While instantiating "std::swap<vector unsigned long long[2]>(unsigned long long(&)[2], unsigned long long(&)[2])". "rijndael.cpp", line 277: Where: Instantiated from non-template code. 1 Error(s) detected. gmake: *** [rijndael.o] Error 2 gmake: *** Waiting for unfinished jobs.... ERROR: failed to make cryptest.exe

Рассматриваемый код:

std::swap(*(__m128i*)(rk), *(__m128i*)(rk+4*m_rounds));

У меня есть пара вопросов:

  • С чем у компилятора проблемы?
  • Как лучше всего устранить ошибку?

Я должен задать второй вопрос, потому что я не уверен в SunCC и типе __m128i, учитывая, что я мог бы использовать необработанный memcpy, попытаться написать свой собственный своп или даже попробовать iter_swap без разыменования.


person jww    schedule 17.07.2016    source источник
comment
Поддержка std::swap с C-массивами была добавлена ​​в C++11; Вы включили С++ 11/14 для своего компилятора?   -  person ildjarn    schedule 17.07.2016
comment
@ildjarn - О, большое спасибо. Я считаю, что Sun Studio 12.2 - это только С++ 03. В этом случае, как написать своп, если __m128i непрозрачный? Должен ли я просто memcpy это?   -  person jww    schedule 17.07.2016
comment
Общая реализация swap обычно создает временный объект типа T temp( b );, где b — формальный аргумент ссылочного типа. До C++11 это вызывалось для необработанных массивов как фактические аргументы. И это не компилируется (точно так же, как int x[3]; int y[3]( x ); не компилируется).   -  person Cheers and hth. - Alf    schedule 17.07.2016
comment
@ildjarn - вам, вероятно, следует дать ответ. Вы предоставили критически важную информацию, ответив на вопрос С чем возникли проблемы у компилятора?. Я не знал, что это нестандартно, и любой другой компилятор его принимает (даже Sun Studio 12.3, который также является C++03).   -  person jww    schedule 17.07.2016
comment
@jww: Я бы не хотел, потому что у меня нет для вас хорошего решения. Но не стесняйтесь отвечать самостоятельно с любыми подробностями, которые вы считаете уместными. :-]   -  person ildjarn    schedule 17.07.2016