今晚编码(我意识到这是情人节)并遇到了一些奇怪的事情......
我有以下一行:
std:;cout << freqs[summations[i]] / 1000 * 10 << std::endl;
这个编译。但是,如果我这样做,它将无法编译。
std;;cout << freqs[summations[i]] / 1000 * 10 << std::endl;
我的编译行中没有任何严格的属性。但是,我不认为GCC会允许编译和输出。这是为什么?
答案 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,是通过普通查找找到的声明的并集 通过查看与之关联的名称空间集找到的声明 函数参数的类型。