以下带有gcc-6 -O2的代码正在编译并提供正确的结果。但是,在启用-O2的情况下切换到gcc 7.3或gcc 8.2后,编译器将执行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:result =(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)