지금 C++은 이거 컴파일 안됨
#include <algorithm>
#include <vector>
using namespace std;
using namespace std::ranges;
int main() {
vector<int> v;
sort(v);
}
왜냐하면 std::sort랑 std::ranges::sort가 충돌 나기 때문임
표준을 왜 이렇게 정했냐면, 표준 위원회 놈들이 이렇게 생각했기 때문임
"어차피 using namespace std; 다 금지하잖아? using namespace std::ranges; 하나만 써라. 뭘 두개 동시에 쓰려고 함?"
아니 ㅆㅂ 이게 가스라이팅 아님?
using namespace std;를 금지하고 말고는 집단이나 개인이 알아서 할 일이지,
왜 그런 convention을 언어 표준 차원에서 강제하면서
내가 편하게 타이핑하고 싶은 코드의 컴파일을 막아버리는 거임?
이렇게 된 원인은 using namespace std;를 쓰면 C++ 프로그래머들이 지랄 발광을 하기 때문인데
이것의 근본적인 이유는 근본적으로 module 개념이 없는 개틀딱 언어라서
#include될때 export되는 코드의 범위를 조절할 수 없었기 때문임.
즉 module이 완전히 자리잡으면 파이썬처럼 module 내에서는
using namespace std; 쓴 뒤에 이게 export 될 걱정 없이 쾌적한 코딩이 가능함.
module이 #include를 대체하면 using namespace std;도 자리잡을 것이고
이거 쓴다고 지랄하는 사람들도 없어질거임
근데 지금 구현체들 다들 버그가 존나 많아서 제대로 쓸수가 없음
어제 gcc 써봤더니 모듈 내에서 unique_ptr 생성해서 다른 모듈로 넘겨줬더니 segfault 나서 뒤짐
msvc 써봤더니 모듈 내에서 선언한 템플릿 인자를 다른 모듈이 못알아봐서 컴파일이 안됨
아 빨 리 쓰 고 싶 다!
저게 진심 왜 문제인지 모르겠는데 저런식으로 패키지 이름이나 모듈 이름 생략해서 나오는 충돌은 C#, Java, Rust 다 있는데?
using namespace std;는 소스 파일에 쓰면 사실 별로 문제가 안됨. 헤더에 썼을때 문제가 되는건데, 헤더에 using namespace std;를 박아버리면 그 헤더를 인클루드하는 "모든" 프로그램에 using namespace std;가 전염됨. 그래서 쓰지 말라는 합당한 이유가 있는거임.
근데 C++ 템플릿은 설계 방식 때문에 TMP 쓸려면 header-only library로 짜지 않고는 힘듬. 그래서 라이브러리 좀 짜려면 헤더에 코드를 다 박아야 되는데, 헤더에는 using namespace std;를 쓰는게 위험하기 때문에 std::를 울며 겨자먹기로 붙여야함
모듈이 #include를 완전히 대체할 수 있다면, 이걸 포함해 헤더 인클루드가 갖는 수많은 문제점이 해결됨.