C ++ 17은 [[nodiscard]]
속성을 도입하여 프로그래머가 반환 된 객체를 호출자가 버릴 경우 컴파일러가 경고를 생성하는 방식으로 함수를 표시 할 수 있습니다. 전체 클래스 유형에 동일한 속성을 추가 할 수 있습니다.
원래 제안 에서이 기능의 동기에 대해 읽었 으며 C ++ 20은 표준 값에 속성을 추가한다는 것을 알고 있습니다 std::vector::empty
.
시원하고 유용한 기능입니다. 실제로, 그것은 거의 너무 유용한 것 같습니다 . 내가 읽는 모든 곳 [[nodiscard]]
에서 사람들은 선택한 기능이나 유형에 추가하고 나머지는 잊어 버린 것처럼 토론합니다. 그러나 왜 새 코드를 작성할 때 무시할 수없는 값이 특별한 경우 여야합니까? 폐기 된 반환 값은 일반적으로 버그 또는 최소한의 리소스 낭비가 아닙니까?
그리고 컴파일러가 가능한 한 많은 오류를 잡아야하는 C ++ 자체의 설계 원칙 중 하나가 아닙니까?
그렇다면 [[nodiscard]]
거의 모든 단일 비 void
기능 및 거의 모든 단일 클래스 유형에 고유의 비 유효 코드를 추가하지 않겠습니까?
내 코드 에서이 작업을 시도했지만 너무 장황하여 Java처럼 느껴지기 시작한다는 것을 제외하고는 정상적으로 작동합니다. 의도를 표시하는 다른 몇 가지 경우를 제외하고 기본적으로 버려진 반환 값에 대해 컴파일러 에게 경고 하는 것이 훨씬 더 자연스럽게 보일 것입니다 [*] .
표준 제안서, 블로그 항목, 스택 오버플로 질문 또는 인터넷의 다른 곳에서이 가능성에 대한 토론이 전혀 없었으므로 뭔가 빠진 것이 틀림 없습니다.
새로운 C ++ 코드에서는 왜 그런 역학이 이해가되지 않습니까? 자세한 정보가 [[nodiscard]]
거의 모든 곳 에서 사용하지 않는 유일한 이유 입니까?
[*] 이론적으로, 표준 라이브러리 구현 [[maydiscard]]
과 같은 기능에 소급하여 추가 할 수 있는 속성이 대신있을 수 있습니다 printf
.
const
단순한 "클래스"클래스 (또는 "일반적인 오래된 데이터 오브젝트")를 부 풀릴 수 있습니다 .
std::vector
or 와 같은 표준 라이브러리 클래스와 관련 std::unique_ptr
이 있으며 클래스 정의에 데이터 멤버가 필요합니다. 나는 두 언어로 일했습니다. Java는 괜찮은 언어이지만 더 장황합니다.
operator =
예를 들어. 그리고std::map::insert
.