The issue of cross-compilers is actually a corollary of a much more basic theorem of compilers:
Sortie randomly inventing compiler theorems wrote:
(1) A compiler must be correct.
From this it follows:
Sortie randomly inventing compiler theorems wrote:
(2) A compiler must target the intended target,
(3) Otherwise, a compiler cannot reliably compile and is not correct for that purpose.
Informally:
Sortie randomly inventing informal compiler theorems wrote:
A compiler must know what is going on otherwise you cannot expect the compiler to be correct.
When you develop a new operating system without using a cross-compiler, you are violating (2) (and thus (1)) because you lying to the compiler (it still thinks it is targeting Linux or whatever your build system is) rather than the fact that you are targeting a new operating system (your own). That's why when you #include headers it gets them from /usr/include; that's why when you link against libraries it gets them from /usr/lib; that's why it declares the preprocessor symbol __linux__; and so on. The compiler is correct from its point of view, it doesn't know you are violating (2). In other words:
Sortie randomly inventing other words wrote:
The compiler that came with your distribution that targets your distribution is not a compiler for your OS because your OS is not the local system you are using, thus you cannot use it for osdev.
You can, however, use a gcc cross-compiler in accordance with the above theorems because you don't violate (2) by letting the compiler know it is not targeting the local system, but rather that it is a cross-compiler for a bare system. This is good enough, though you'll want to teach the compiler later on what your operating system is.
As for Visual Studio?
Sortie inventing corollaries about Visual Studio wrote:
Visual Studio targets Windows and your operating system is not Windows, therefore Visual Studio doesn't target your OS and is not correct for the purpose of compiling your OS. Additionally, you cannot port it or teach it what your operating system is due to its proprietary nature.
You should understand that it is absolutely irrelevant whether your compiler is a cross-compiler, but that the important part is that the compiler targets the correct target. For example, it is still wrong if you use a cross-compiler running on your i386-linux-gnu system that targets powerpc-elf to build your x86_64 ELF kernel, even though it is a cross-compiler it is the wrong one. For example, if you port gcc to your x86_64-myos system and it targets x86_64-myos then you can use it to build your operating system, even though it is not a cross-compiler.
Thus, don't tell people as such to unconditionally use a cross-compiler, but to use a compiler that targets the intended system and that the compiler that came with their distribution doesn't target their intended target, thus they need a cross-compiler in their particular case (until they go self-hosting).