以下带有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] << ", " …Run Code Online (Sandbox Code Playgroud)