为什么C ++不允许::在已知类型的对象上?

时间:2016-05-20 23:52:45

标签: c++ language-lawyer

#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;
}

3 个答案:

答案 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)

为什么不呢?以下是一些想法:

  1. 没有权威的答案。 Read this
  2. 没有人提出这样的事情。 Have at it
  3. 在您拥有变量的每个上下文中,您已经拥有该变量的类型,因此您始终可以使用该类型。
  4. ::称为范围解析运算符。类具有范围。命名空间有范围。变量没有范围。
  5. 已经有了合理的解决方法。无法执行vi::iterator,但您可以执行decltype(vi)::iterator,那么为什么会混淆语言?