2014-01-10 1 views
22

문자열 리터럴 ""에 대해 Clang 3.4 및 테스트 접미어 연산자를 설치합니다.C++에서 std :: string에 대한 연산자 접미사 14

#include <string> 

//1. using namespace std; // without compile error. 
//2. using std::operator ""s; // or without it compile error, too. 
// for success compiles, need 1. or 2. line. 

int main() 
{ 
    auto s = "hello world"s; 
} 

1과 2에 주석을 달면 컴파일 오류가 발생합니다. 하지만 큰 프로젝트 1.- 방법이 나쁘다는 것을 알고, 과 2.- 방법은 낯선 사람입니다.

QA : 글자없이 연산자 ""를 사용할 수 있습니까? using namespace stdusing std::operator ""s? 코멘트를 포장

int main() 
{ 
    using namespace std; 
    auto s = "hello world"s; 
} 
+2

"2.- 방법이 이상합니다." 왜 이상하다고 생각하니? 내게 아주 자연스러워 보입니다. – Suma

+1

짧은 대답 : 아니오, 할 수 없습니다. 그것이 의도 된 방식이고 Clang은 1. 또는 2.를 요구하는 것이 옳습니다. 당신이 이것에 만족하지 않고 그것이 어떻게 정의되었는지에 대한 의문을 제기하고자하는 것처럼 보입니다. 그러나 그것은 적절한 Q가 아닙니다. –

+8

도대체 ... 접미사를 문자 그대로 사용하려면'using '이 정말로 필요합니까? boggles. –

답변

25

:

+0

std :: literals; 및 std :: literal :: string_literals; 표준 인라인 네임 스페이스 또는 컴파일러 구현 네임 스페이스에만 해당합니까? – Khurshid

+1

@Khurshid 표준화되어있어 휴대가 가능합니다. "Header ''개요"의 끝에있는 "§ 21.3 문자열 클래스 [string.classes]"를 참조하십시오. –

+1

@Khurshid 그들은'namespace'의'inline'을 표준화하여'using std;'가 리터럴 연산자를 도입 할 수 있도록했습니다. 다른 결과는 놀라운 것으로 간주되었다. – emsr

2

당신이 두번째 옵션이 이상한 발견하는 경우, 즉 실제로 매우 일반적입니다,이 같은 "을 사용하여 네임 스페이스 표준"의 범위를 제한 할 수

당신은이 명시 적으로 해당 연산자를 using으로 가져옵니다. 이것은 표준에서 의도 한 것입니다. 당신은 당신이 필요로하는 것만으로 끌어 고려해야 중 하나

using namespace std::literals; 

또는

using namespace std::literals::string_literals; 

필요에 따라, 후자의 경우에만, 당신이 필요하지 더 끌어 (의심스러운 경우에 바람직하다). 선언이나 지시어를 사용하는 모든 경우에서와 마찬가지로 실용적인 가장 작은 범위로 제한하려고합니다.

연산자를 명시 적으로 가져올 필요가있는 이유는 접미어가 다른 컨텍스트에서 향후 확장에 다시 사용될 수 있기 때문입니다.

관련 문제