VS2010-VS2015下编译时如何使用decltype作为较大类型表达式的LHS
How to use decltype as the LHS of a larger type expression when compiling under VS2010-VS2015
我有两个版本的代码,都使用 decltype
和 declval
。一个有效,一个无效。它们包含在下面。我已经在 VS2017 及以下版本上对此进行了测试,并且得到了相同的结果。 VS2018 会编译它。 GCC 和 Clang 都编译它。
在 MSVC 下为失败案例生成的错误是
[x86-64 MSVC 19 2017 RTW #1] error C3646: 'type': unknown override
specifier
为线
typedef typename decltype(boost::declval<Func>()(SegmentVec()))::value_type type;
有关以下代码的实时版本,请参阅 God Bolt。
#include <vector>
#include "boost/type_traits/declval.hpp"
typedef std::vector<int> SegmentVec;
/////////////////////////////////
// The below fails
template <typename Func> struct Traits {
typedef typename decltype(boost::declval<Func>()(SegmentVec()))::value_type type;
};
template <typename F> auto Hof(F f) -> typename Traits<F>::type {
return f(std::vector<int>{2})[0];
}
/////////////////////////////////
/////////////////////////////////
// The below works
template <typename Func> struct Traits2 {
typedef typename decltype(boost::declval<Func>()(SegmentVec())) type;
};
template <typename F> auto Hof2(F f) -> typename Traits2<F>::type {
return f(std::vector<int>{2});
}
/////////////////////////////////
int main(){
auto lmd = [](std::vector<int> const & a){return a;};
Hof(lmd);
Hof2(lmd);
}
是否可以在不显着更改代码的情况下,让代码在 MSVC 2010 向上编译。上面的代码本身是从更大的代码体中提取的,除了证明编译器错误之外不一定有任何意义。
为了取悦那个有问题的 MSVC,您可以部分完成 (demo):
template <typename Func> struct Traits {
typedef decltype(boost::declval<Func>()(SegmentVec())) suptype;
typedef typename suptype::value_type type;
};
using Tnew = Told;
是一个更好的语法 ;)
我有两个版本的代码,都使用 decltype
和 declval
。一个有效,一个无效。它们包含在下面。我已经在 VS2017 及以下版本上对此进行了测试,并且得到了相同的结果。 VS2018 会编译它。 GCC 和 Clang 都编译它。
在 MSVC 下为失败案例生成的错误是
[x86-64 MSVC 19 2017 RTW #1] error C3646: 'type': unknown override specifier
为线
typedef typename decltype(boost::declval<Func>()(SegmentVec()))::value_type type;
有关以下代码的实时版本,请参阅 God Bolt。
#include <vector>
#include "boost/type_traits/declval.hpp"
typedef std::vector<int> SegmentVec;
/////////////////////////////////
// The below fails
template <typename Func> struct Traits {
typedef typename decltype(boost::declval<Func>()(SegmentVec()))::value_type type;
};
template <typename F> auto Hof(F f) -> typename Traits<F>::type {
return f(std::vector<int>{2})[0];
}
/////////////////////////////////
/////////////////////////////////
// The below works
template <typename Func> struct Traits2 {
typedef typename decltype(boost::declval<Func>()(SegmentVec())) type;
};
template <typename F> auto Hof2(F f) -> typename Traits2<F>::type {
return f(std::vector<int>{2});
}
/////////////////////////////////
int main(){
auto lmd = [](std::vector<int> const & a){return a;};
Hof(lmd);
Hof2(lmd);
}
是否可以在不显着更改代码的情况下,让代码在 MSVC 2010 向上编译。上面的代码本身是从更大的代码体中提取的,除了证明编译器错误之外不一定有任何意义。
为了取悦那个有问题的 MSVC,您可以部分完成 (demo):
template <typename Func> struct Traits {
typedef decltype(boost::declval<Func>()(SegmentVec())) suptype;
typedef typename suptype::value_type type;
};
using Tnew = Told;
是一个更好的语法 ;)