【发布时间】:2018-12-07 06:16:38
【问题描述】:
我正在尝试获取范围的显式类型(将来我可能希望将其存储为类中的字段)。但是,由于某种原因,它的计算结果为 void?
#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() {
}
使用 g++ -std=c++17 编译时,会给出
main.cpp:24:88: error: return-statement with a value, in function returning 'void' [-fpermissive]
(g++ 版本g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0)
我在 Visual Studio 2017, v. 15.9 上遇到类似错误
这个问题是我的另一个问题的延续:How to store a range as a field in a class?,但更具体,我相信它应该分开。
【问题讨论】: