15

据我了解,decltype 用于查询对象/变量的类型等。

来自维基百科上的示例,例如:

int i;
decltype(i) x3; // type is int

我以为我可以做这样的事情:

class A
{
public:
    int a, b;
};

template<typename T>
struct IsClass
{
    enum { Yes = std::is_class<T>::value };
    enum { No = !Yes };
};

std::vector<A> v;
auto it = v.begin();
IsClass<decltype(it)::value_type>::Yes

因为毕竟这条线是合法的:

IsClass<std::vector<A>::iterator::value_type>::Yes

唉,它不会编译,引用以下内容:error C2039: 'value_type' : is not a member of '全局命名空间''`

关于为什么在存在 decltype 的情况下进行范围解析以这种方式表现的任何想法?

PS:如果有什么不同,我使用的是 MSVC2012(没有Nov CTP)

4

1 回答 1

10

这是 Visual C++ 编译器中的一个已知错误。从 Visual C++ 2013 Preview 开始,它还没有被修复。您可以使用以下方法解决此问题std::common_type

IsClass<std::common_type<decltype(it)>::type::value_type>::Yes
        ^^^^^^^^^^^^^^^^^            ^^^^^^^

std::common_type使用单个模板参数会产生该参数类型;它是标准化的 C++11 等价于identity长期用于元编程的模板。)

您可以在 Microsoft Connect 上找到公共错误报告: Cannot use decltype before scope operator。如果此问题对您很重要,请考虑支持该错误报告。

于 2013-07-06T18:21:42.143 回答