我有一些机制get_return_type
可用于未评估的上下文,以推断函数的返回类型,而无需提供参数类型:
template <typename Result, typename... Args>
Result get_return_type(Result (*)(Args...));
int example(double, char, bool);
// will be int
using result_type = decltype(get_return_type(example));
但是,如果该函数是模板,并且其返回类型为auto
,则所有版本的GCC I尝试都无法编译。 Clang工作得很好。
namespace TemplatedFunctionReturningAutoTest
{
template <typename T>
auto foo(T v) { return v; }
// GCC complains that Result type cannot be deduced in
// template substitution of get_return_type
static_assert(std::is_same<int, decltype(get_return_type(foo<int>))>::value, "");
}
这是关于godbolt(gcc 6.2):https://godbolt.org/g/iIh6TU
如果你切换到clang 3.x它工作正常!感觉GCC不愿意实例化函数体以找出它的返回类型。
这是一个GCC错误,还是标准中有什么东西阻止它工作?