据我了解,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

las,它不会编译,引用如下:error C2039: 'value_type' : is not a member of '全局命名空间''

关于为什么在存在decltype的情况下使作用域解析如此操作的任何想法?

P.S:如果有什么不同,我正在使用MSVC2012(无11月CTP)

最佳答案

这是Visual C++编译器中的一个已知错误。自Visual C++ 2013预览版以来,此问题尚未修复。您可以使用std::common_type解决此问题:

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

(带有单个模板参数的std::common_type会产生该参数类型;这是已在元编程中长期使用的identity模板的标准化C++ 11等效项。)

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

关于c++ - 为什么在存在decltype的情况下作用域解析失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17499417/

10-14 09:13