为什么会这样编译?cout<"是";

Mia*_*ang 8 c++ gcc

#include<iostream>
using namespace std;
int main(){
     cout<"Yes"; 
}
Run Code Online (Sandbox Code Playgroud)

它可以编译,但是当它运行时,它什么也不做。这是其他地方的编译错误。编译器是 gcc 4.9.2

和....相比

 #include<iostream>
    using namespace std;
    int main(){
         cout<<"Yes"; 
    }
Run Code Online (Sandbox Code Playgroud)

它缺少“<”,但仍然可以编译。

我预计这是一个编译错误,就像变量一样,如下所示:

#include<iostream>
using namespace std;
int main(){
     cout<"Yes"; 
}
Run Code Online (Sandbox Code Playgroud)

下面的代码也会发生这种情况。

   #include<iostream>
    using namespace std;
    int main(){
         cin>"Yes"; 
    }
Run Code Online (Sandbox Code Playgroud)

编辑:同样的事情发生

#include<iostream>
int main(){
    
    std::cout<"Yes";
}
Run Code Online (Sandbox Code Playgroud)

另外,我启用了编译器警告,但没有。

Rus*_*lan 10

GCC<6.1(包括您的 4.9.2)中的默认 C++ 标准是gnu++98,而对于 GCC\xe2\x89\xa56.1 则是gnu++14(如记录的,例如此处)。因此,后一个编译器默认情况下不会接受此代码,因为explicit operator bool()它存在于 C++11 以来的 iostream 中,而不是operator void*()C++98 中(请参见cppreference)。

\n

如果您打开警告,您可能会收到警告:

\n
$ g++-4.8 test.cpp -o test -Wall\ntest.cpp: In function \xe2\x80\x98int main()\xe2\x80\x99:\ntest.cpp:5:15: warning: value computed is not used [-Wunused-value]\n     std::cout < "Yes";\n               ^\n
Run Code Online (Sandbox Code Playgroud)\n

其中test.cpp包含示例代码:

\n
#include <iostream>\n\nint main()\n{\n    std::cout < "Yes";\n}\n
Run Code Online (Sandbox Code Playgroud)\n


Cal*_*eth 5

在 C++11 之前,支持的方式if (std::cin >> var)是流对象隐式转换为void *.

在应用转换->和-> ->后,因此std::cout<"Yes"被评估为调用内置的。bool operator<(void*, const void*)std::basic_iosvoid *const char[4]const char*const void*

自 C++11 起,现在有一条规则,即可以在 等中使用 的explicit转换。这样, 就被更改为,并且重载解析正确地发现没有匹配boolifwhileoperator void*explicit operator boolstd::cout<"Yes"