这个使用 decltype 和 declval 的 c++ typedef 应该如何编写以使其可移植?

How should this c++ typedef using decltype and declval be written to make it portable?

我有以下

template <typename F, typename A0>
struct ResultOf {
        typedef typename decltype(boost::declval<F>()(boost::declval<A0>())) Type;
};

它的编写是为了让 VS2010 可以具有适用于特定用例的 result_of。它在 vs2015、vs2013 和 vs2010 下工作,但在 gcc 下我得到一个编译错误

error: expected nested-name-specifier before ‘decltype’
typedef typename decltype(boost::declval<F>()(boost::declval<A0>())) Type;

这里有明显的小修复吗?

typename 这里不需要关键字。当编译器无法知道 value_type 是否是一种类型时,它特别用于表示依赖类型,如 T::value_type。当前案例中没有依赖类型。

删除 typename 在 clang、gcc 和现代 msvc 中有效:

https://godbolt.org/z/CfOw-_