O intervalo explícito-v3 decltype é avaliado como nulo?

Estou tentando obter um tipo explícito de um intervalo (talvez eu queira armazená-lo como um campo em uma classe no futuro). No entanto, por algum motivo, ele avalia comovoid?

#include <iostream>
#include <set>
#include <range/v3/view/transform.hpp>

class Alpha {
public:
  int x;
};

class Beta : public Alpha {

};

class Foo {
public:
  std::set<Alpha*> s;

  using RangeReturn = decltype(std::declval<std::set<Alpha*>>() | ranges::v3::view::transform(std::function<Beta*(Alpha*)>()));
  RangeReturn r();
};

Foo::RangeReturn Foo::r() {
  return s | ranges::v3::view::transform([](Alpha* a) { return static_cast<Beta*>(a); });
}

int main() {
}

Ao compilar com g ++ -std = c ++ 17, ele fornece

main.cpp:24:88: error: return-statement with a value, in function returning 'void' [-fpermissive]

(versão g ++ g ++ (Ubuntu 7.3.0-27ubuntu1 ~ 18.04) 7.3.0)

Eu recebo um erro de tipo semelhante no Visual Studio 2017, v. 15.9

Esta pergunta é uma continuação da minha outra pergunta:Como armazenar um intervalo como campo em uma classe? mas é mais específico e acredito que merece ser separado.

questionAnswers(1)

yourAnswerToTheQuestion