C ++ / GCC - 为什么要编译

时间:2014-02-14 23:26:28

标签: c++ gcc

今晚编码(我意识到这是情人节)并遇到了一些奇怪的事情......

我有以下一行:

std:;cout << freqs[summations[i]] / 1000 * 10 << std::endl;

这个编译。但是,如果我这样做,它将无法编译。

std;;cout << freqs[summations[i]] / 1000 * 10 << std::endl;

我的编译行中没有任何严格的属性。但是,我不认为GCC会允许编译和输出。这是为什么?

3 个答案:

答案 0 :(得分:6)

std:;被解析为标签,后跟空语句。

答案 1 :(得分:5)

第一行提供标签std:,后跟空语句 - 分号。

其他人使用cout << ...表示您必须拥有using namespace std;using std::cout;或类似的效果。

第二个使用未定义的标识符std

答案 2 :(得分:0)

std:;是一个标签。另一部分是使用argument dependent name lookup来解析命名空间。

因为您说您没有在代码中使用命名空间。我猜测它是有效的,因为你最后使用std :: endl(如果你从endl中删除std它将无法编译)。正在使用argument dependent name lookup。这是标准的一部分:

  

仅当非限定名称的正常查找失败时才会发生ADL   找到匹配的类成员函数。在这种情况下,其他名称空间   在正常查找期间不考虑可以搜索其中的集合   要搜索的名称空间取决于函数的类型   参数。具体来说,在此期间发现的声明集   ADL查找过程,并考虑用于解析函数   name,是通过普通查找找到的声明的并集   通过查看与之关联的名称空间集找到的声明   函数参数的类型。

相关问题