【发布时间】:2013-07-04 04:17: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 'global namespace''`
关于为什么在 decltype 存在的情况下进行范围解析以这种方式表现的任何想法?
P.S:如果有什么不同,我使用的是 MSVC2012(没有 Nov CTP)
【问题讨论】:
-
gcc和clang似乎接受了这一点:coliru.stacked-crooked.com/… -
@ShafikYaghmour 我刚刚将它粘贴到我正在使用的 MSVC2012 中(我为此添加了注释),但它无法编译。
-
MSVC 确实很糟糕,他们在实施标准方面没有取得与 gcc 和 clang 相同的进展
-
虽然可以编译:
IsClass<std::remove_reference<decltype(it)>::type::value_type>::Yes;我的猜测是,虽然它应该是一个值类型,但 MSVC 错误地在这里为decltype(it)生成了一个引用类型。 -
这是一个已知问题。试试
typedef decltype(it) itType然后使用它。