MS Visual C++ 에서 함수에 임시 객체를 (non const) reference로 넘기기

작년 하반기에 VisualStudio 2013 기준으로 작성된 C++ 프로젝트를 linux (+ GCC)로 옮기는 작업을 했다. 그 때 제일 충격적이었던 것은 — 한 2년넘게 Windows 환경 작업을 (직업적으로는) 안한 탓이 크겠지만 — 이 글 제목의 그것:

void func(X &x);
// ...
func(X());

이런 코드가 문제없이 컴파일되고 동작하는 것.

문제는 이 코드는 GCC 혹은 clang 에서 제대로 빌드되지 않는다; 게다가 저게 단순히 저런 함수 꼴 하나였으면 참 좋았을텐데, template + perfect forwarding이 섞인 코드라 반쯤 돌아버리는 줄 알았음. 여하튼 VisualStudio에서만 작업할게 아니라 다른 OS/Platform으로 포팅할 생각이 있다면 VS의 language-extension으로 지정된 부분들은 좀 버리고 갑시다.