2014-12-01 1 views
6

snprintfostream에 서식을 지정하여 스트림 표현 자체에 snprintf에 대한 호출을 포함시킬 수 있는지 궁금합니다. 이것은 GCC 4.9에서 컴파일되지만 괜찮습니까?C++에서 rvalue 버퍼를 사용하여 ostream에서 snprintf를 사용하면이 형식이 올바른 것입니까?

cout << [](char (&&buf) [12], int d) { snprintf(buf, 12, "%d", d); return buf; } ({ }, 15) << endl; 
+3

그 코드 라인은 람다 사용에 대한 상을 획득해야합니다. – Barry

+0

여기서 중요한 질문은, IMO는'{}'이 배열 타입의 rvalue에 어떻게 묶이는 지, 이것이 일어나기 위해서는 그것이 무엇을 의미하는지입니다. 우리가 그 질문에 대답 할 때,이 코드가 행동을 정의했는지 여부에 대한 질문에 답이 나올 것입니다. 또한, 그 라인의 끝 부분에 여분의')'이 하나 있습니다. – cdhowie

+0

@cdhowie, 질문의 본성에 대해 당신이 맞다고 생각합니다. 나는 여분의''를 제거했습니다. – ThomasMcLeod

답변

7

잘 정의되어 있으며 잘 정의되어 있습니다. {}은 참조 값이 바인딩 된 char [12] 배열을 임시로 생성하는 char [12]에 대한 소수 값 참조를 복사리스트 초기화하는 데 사용됩니다. 이 임시는 전체 식의 끝까지 살며 -이 경우 세미콜론까지이므로 배열의 요소에 대한 포인터를 안전하게 반환하여 해당 식 내에서 인쇄 할 수 있습니다. (람다이 어레이의 첫 번째 요소로 char * 포인팅을 리턴한다.)

Standardese :

§8.5 [dcl.init]/P17 : 다음 초기화의

의미론이다. [...] 이니셜은 (비 괄호) 보강-INIT리스트이다

  • 경우 객체 또는 기준리스트 초기화 (8.5.4)이다.

§8.5.4 [dcl.init.list]/P3 다음과 같이 목적이나 종류 T의 기준

리스트 초기화 정의된다 :

  • [...]
  • T이 참조 유형 인 경우 T이 참조하는 유형의 임시 값은 co py-list-initialized 또는 직접 목록 초기화, 에 대한 초기화의 종류에 따라 다르며 참조는 임시로 바인딩됩니다. [참고 : 참조 유형이 비 const 유형에 대한 값이있는 참조 일 경우 일반적으로 바인딩이 실패하고 프로그램이 잘못 작성됩니다. - 엔드 노트 ]

§12.2 [클래스입니다.임시]/P5 :

함수 호출 (5.2.2)가 호를 포함 전체 표현식이 완료 될 때까지 지속에서 기준 파라미터 위해 임시 결합.

+0

이것이 내가 필요한 답변이었습니다. – ThomasMcLeod

3

나는 이것이 괜찮다고 확신한다. 올바르게 이해하면 람다는 char[12] 유형의 객체를 임시로 반환합니다 (자동 반환 유형 공제에서). 그 임시는 다른 함수로 전달 될 수 있습니다.이 경우 operator<<()입니다.

잠재적으로 사본이 만들어 졌음을 의미하지만 RVO가이를 처리 할 수 ​​있습니다.

주석과 T.C. 의해 제공되는 더 나은 대답 한 바와 같이 업데이트

이 람다 추론 반환형 오히려 CHAR [12] *보다 실제로는 숯이다. 나는 이것을 GCC의 코드로 확인했다.

+0

'char [12]'를 반환하지 않습니다. 'char *'를 돌려 준다. –

+0

확인 ... 감사합니다! –

관련 문제