decltype的行为

时间:2011-05-23 19:08:31

标签: c++ visual-studio-2010 c++11 visual-c++ decltype

假设我有一些stl容器类obj的对象。我可以这样定义同类型的其他对象:

decltype(obj) obj2;

但是我不能用这种方式为容器声明迭代器:

decltype(obj)::iterator it = obj.begin();

为什么呢?我做错了吗?

3 个答案:

答案 0 :(得分:16)

根据最终的C ++ 0x草案(FDIS),您的代码格式正确。这是Visual Studio编译器尚未实现的后期更改。

与此同时,解决方法是使用typedef:

typedef decltype(obj) obj_type;
obj_type::iterator it = obj.begin();

编辑:相关章节和经文是5.1.1 / 8:

qualified-id:
    [...]
    nested-name-specifier templateopt unqualified-id

nested-name-specifier:
    [...]
    decltype-specifier ::

decltype-specifier:
    decltype ( expression )

为了完整起见:

The original core issue

Proposal for wording

答案 1 :(得分:8)

这是因为解析语言的方式。

decltype(obj)::iterator it = obj.begin();

你希望它成为

(decltype(obj)::iterator) it;

但事实上,它变成了

decltype(obj) (::iterator) it;

我必须承认,我也很惊讶地发现情况确实如此,因为我确信我之前已经这样做了。但是,在这种情况下,您可以使用auto,甚至decltype(obj.begin()),但此外,您可以执行

typedef decltype(obj) objtype;
objtype::iterator it;

答案 2 :(得分:2)

在修复VC ++的解析器以反映FDIS之前的另一个解决方法是使用std::identity<>元函数:

std::identity<decltype(obj)>::type::iterator it = obj.begin();