下面的代码应该输出6
,但它却输出5
。我不知道为什么。这是怎么回事?
#include <iostream>
template <typename T>
void foo(T& y)
{
y++;
}
int main()
{
int x = 5;
// Why won't this line work???/
foo(x);
std::cout << x;
}
您正在使用trigraphs的好技巧。
// Why won't this line work???/
| |
\ /
|
~trigraph~
??/
trigraph 依次转换为基本上将\
当前行与下一行连接起来,因此您的代码或多或少像这样:
// Why won't this line work? foo(x);
确实是个好技巧。
引用 C++11 标准:
§2.2.2:
每个反斜杠字符 (\) 的实例后面紧跟一个换行符被删除,拼接物理源代码行以形成逻辑源代码行。...
§2.4.1:
Table 1 - Trigraph sequences
...
==========================
| Trigraph | Replacement |
==========================
| ... |
==========================
| ??/ | \ |
==========================
幸运的是,GCC 似乎检测到了这种诡计,发出警告(只是设置-Wall
):
main.cpp:13:32: warning: trigraph ??/ converted to \ [-Wtrigraphs]
// Why won't this line work???/
^
main.cpp:13:4: warning: multi-line comment [-Wcomment]
// Why won't this line work???/
^
相关参考:
以及所有其他类似的问题。??)
PS:这是一个笑脸。
??/
是一个被替换为的Trigraph 序列\
。
对于编译器来说\
,紧随其后的行是当前行的一部分。在这种情况下,当前行是注释。有效的结果是:
// Why won't this line work foo(x);
// Why won't this line work???/
foo(x);
三元组??/
变为\
,因此代码将被翻译为:
// Why won't this line work?\
foo(x);
字符串连接有效。
当我在 g++ 中测试它时,trigraph 默认关闭(生成警告),它将输出 6。如果使用 编译g++ t.cpp -trigraphs
,将输出 5。
可能您的评论被解释为“删除”函数调用的三元图(不是树形图!)。
http://ideone.com/sU4YGc为我在评论中删除 ??/ 工作。
// Why won't this line work?
foo(x);