Вот так не знал. А есть хоть один пример такой глобальной переменной?
смысл в том, что стандарт декларирует собственную нотацию именования своих имен.
и объявляет UB (то есть последствия на совести разработчика),
если кто-то в своем коде использовал туже самую нотацию.
пример:
http://rextester.com/SZZHT85689#include <iostream>
#include <string>
std::string _value="собственность реализации языка с++";
template<class HAHAHA> struct Trololo
{
Trololo(void)
: _value("oh lol")
{}
std::string _value;
};
template<class DISREGARD_THAT>
struct CMyAwesomeClass: Trololo<DISREGARD_THAT>
{
void SetValue(const std::string& value)
{ _value = value; }
};
int main()
{
CMyAwesomeClass<int> c;
c.SetValue("ok");
std::cout << c._value << std::endl;
}
вывод:
oh lol
но строго говоря это - пример простейшей коллизии с глобальными именами,
которые могут происходить в любой нотации при неаккуратном использовании.
другое дело, что согласно стандарту в "глобальные имена" включаются не только
простые имена переменных или функций,
но и макросы тоже.
а это - глобальные идентификаторы,
которым неведомы никакие барьеры.
а это уже означает, что если вы используете нотацию "реализации с++",
то у вас потенциально может возникнуть коллизия,
от которой вы никак не сможете превентивно защититься.
собственно, поэтому стандарт и объявляет посягательство на его нотацию как UB
грамотные любители подчеркиваний используют подчеркивания в конце имени,
но никак не в начале.