Во-первых, то, что вы пытаетесь сделать, может быть достигнуто с помощью чистого C ++, поэтому использование разных путей кода для разных компиляторов не очень хорошая идея. Следующее, что вы должны сказать нам, под каким компилятором это не получается.
Я могу вам сказать, что в версии LLVM это, безусловно, завершится ошибкой, поскольку вы возвращаете указатель на первый элемент локального массива, который становится недействительным сразу после оператора return. GCC и большинство других должны работать, хотя.
Теперь я бы порекомендовал вместо использования простых массивов создать вектор внутри себя и вернуть его. Это избавит вас от необходимости вручную управлять памятью (если вы динамически распределяете массив) или от других проблем, подобных той, с которой вы столкнулись.