#include <vector>
int main()
{
std::vector< int > vi;
// This is legal.
for( std::vector< int >::iterator it = vi.begin(); it != vi.end(); ++it )
{
}
// This is not legal. WHY NOT?
// Compiler knows vi's type, as evident from the c++11 syntax for such loop:
// for( auto it : each vi )
// So why not support :: on objects of known type?
for( vi::iterator it = vi.begin(); it != vi.end(); ++it )
{
}
return 0;
}
答案 0 :(得分:4)
因为vi
是变量而不是类型,::
只能应用于类型或命名空间。如果您想获取类型,以便使用::
,请使用decltype
:
for( decltype(vi)::iterator it = vi.begin(); it != vi.end(); ++it )
正如java所示,::
实际上是完全没必要的 - 语言可以使用.
代替,因为上下文总是足以说明发生了什么。是否会使语言更好或更差是完全主观的。
答案 1 :(得分:3)
可以通过在某些情况下将variable::x
等同于decltype(variable)::x
来完成。
根本就没有。
没有“理由”。
抱歉不要提供更多帮助。
随时在the std-discussion
mailing list上向委员会提出建议。
答案 2 :(得分:0)
为什么不呢?以下是一些想法:
::
称为范围解析运算符。类具有范围。命名空间有范围。变量没有范围。 vi::iterator
,但您可以执行decltype(vi)::iterator
,那么为什么会混淆语言?