Следующий код с gcc-6 -O2 компилировался и выдавал правильный результат. Однако после переключения на gcc 7.3 или gcc 8.2 с включенной опцией -O2 компилятор выполняет NRVO и не выдает правильный результат. Любой совет, почему NRVO включен в этом случае и является ли это действительным c ++?
Clang-6, clang-7 и компилятор Intel обеспечивают ожидаемый результат при включенном O3. Когда -fno-elide-constructors передается в gcc7.3, NRVO блокируется, и результат соответствует ожидаемому.
#include <array>
#include <iostream>
using Coordinates = std::array<double, 3>;
Coordinates map( const Coordinates& c, size_t level )
{
Coordinates result{ c[1], c[2], c[0] };
if( level != 0 )
{
result = map( result, level - 1);
}
return result;
}
int main( )
{
Coordinates vecOfCoordinates = { 1.0, 2.0, 3.0 };
size_t level = 1;
auto result = map( vecOfCoordinates, level );
std::cout << "result = (" << result[0] << ", " << result[1] << ", " << result[2] << "), should be (3, 1, 2)" << std::endl;
return 0;
}
g ++ - 6 -O2: результат = (3, 1, 2), должен быть (3, 1, 2)
g ++ - 7: результат = (3, 1, 2), должен быть (3, 1, 2)
g ++ - 7 -O2: результат = (3, 1, 3), должен быть (3, 1, 2)
g ++ - 7 -O2 -fno-elide-constructors: result = (3, 1, 2), должно быть (3, 1, 2)