2014-02-26 1 views
10

빠른 질문하십시오 std::string를 만들기위한 문자 정의되지 않은 C++ (11) 제안에 "사용자 -"(정말, 표준 라이브러리)과 같은std :: string에 대한 표준 정의 리터럴 접미사가없는 이유는 무엇입니까?

auto str = "hello world"s; // str is a std::string 

처럼 C++를 수행하는 이유, 오브젝티브 C가 모두 지원 C 스타일 문자열 및보다 사용자에게 친숙한 라이브러리 유형 NSString; 그러나 C++과 달리 두 사람 사이에 혼동을 느끼는 사람은 아무도 없습니다. @이라는 문자열 리터럴 접두사를 사용하여 NSString을 만드는 것이 쉽지 않기 때문에 아무도 혼동하지 않습니다. 실제로, 문자가이 아니고 Objective-C 코드가 @ 인 경우는 거의 없습니다. 모두가 그 방법을 알고 있으며, NSString을 사용하고 있습니다.

C++ 11 사용자 정의 리터럴이 이것을 허용 할 것이며 사실 Stroustrup의 C++ 11 FAQ의 UDL 섹션에서이 예제를 정확하게 사용합니다. 게다가 앞에 밑줄이없는 UDL은 예약되어 있으므로 위와 같이 일반 s을 허용해도 아무런 문제가 없습니다. 다른 것과 충돌 할 가능성은 없습니다.

아마도 나는 뭔가를 놓치고 있습니다. 그러나 이것은 언어에 매우 가치 있고 위험 부담이없는 것처럼 보입니다. 그래서 C++ 11이 왜 그것을 제공하지 않는지 알 수 있습니까? C++ 14에 나타날 가능성이 있습니까?

답변

19

사용자 정의 리터럴은 C++ 11에서 충분히 새로워졌지만 포함되지 않았지만 C++ 14 (아무도 신경 쓰지 않는 경우 21.7 절)입니다. 그리고 예, 접미사로 s을 사용합니다. 정확한 결과 유형은 문자열 리터럴 자체의 유형에 따라 다릅니다. "좁은"리터럴은 std::string이고, u16 리터럴은 u16string이며, u32 리터럴은 u32string입니다. 오, 그리고 네, 넓은 문자열 리터럴을 사용하기를 원한다면 wstring을 생성 할 것입니다. s 접미사도 (<chrono>에 정의) 초를 의미하는 것으로 사용되지만 문자열 리터럴에 2가 있으며 s 사이에 실제 충돌이 없다는 것을

참고 문자열을 의미하고, 숫자에 s 초를 의미합니다.

+2

글쎄, 우리는 몇 초 만에 완벽한 답을 찾는다. +1 (가능하다면 그 이상). 이상한 것은 원래의 UDL 제안의 일부가 아니지만 거기에 우리가 간다. 나는 마침내 (잘하면) C++ 14에서'char *'의 저주를 잃어버린 것을 고대합니다! –

+0

특히 auto와 조합하여 이것을 사용하고 싶습니다. – Excelcius

+2

@Excelcius : "auto"(적어도 IMO 이상)보다 더 중요한 것은 문자열을 함께 추가하는 것입니다 :' "A"+ "B" 예를 들면. –

관련 문제