gpt4 book ai didi

c++ - VS2010-VS2015下编译时如何使用decltype作为较大类型表达式的LHS

转载 作者:行者123 更新时间:2023-11-30 04:55:13 25 4
gpt4 key购买 nike

我有两个版本的代码,都使用 decltypedeclval。一个有效,一个无效。它们包含在下面。我已经在 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;
};

虽然使用 Tnew = Told; 是一种更好的语法;)

关于c++ - VS2010-VS2015下编译时如何使用decltype作为较大类型表达式的LHS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53154975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com