C++ attribute: nodiscard (since C++17)
nodiscard
로 선언된 함수나
nodiscard
로 선언된 열거형이나 클래스를 값으로 반환하는 함수가
void
로의 형변환을 제외한
폐기값 표현식
에서 호출되면, 컴파일러는 경고를 발행하도록 권장됩니다.
목차 |
구문
[
[
nodiscard
]
]
|
(1) | (C++17부터) | |||||||
[
[
nodiscard
(
문자열 리터럴
)
]
]
|
(2) | (C++20부터) | |||||||
| string-literal | - | 결과가 폐기되어서는 안 되는 이유에 대한 근거를 설명하는 데 사용될 수 있는 평가되지 않은 문자열 리터럴 |
설명
함수 선언, 열거형 선언 또는 클래스 선언에 나타납니다.
만약, 폐기 값 표현식 중 void 로의 캐스트를 제외한 다른 표현식에서,
-
nodiscard로 선언된 함수가 호출되거나, -
값으로 반환되는 열거형 또는 클래스가
nodiscard로 선언된 함수가 호출되거나, -
nodiscard로 선언된 생성자가 명시적 형 변환 또는 static_cast 에 의해 호출되거나, -
nodiscard로 선언된 열거형 또는 클래스 타입의 객체가 명시적 형 변환 또는 static_cast 에 의해 초기화되는 경우,
컴파일러가 경고를 발생하도록 권장됩니다.
|
지정된 string-literal 은 일반적으로 경고에 포함됩니다. |
(since C++20) |
예제
struct [[nodiscard]] error_info { /*...*/ }; error_info enable_missile_safety_mode() { /*...*/ return {}; } void launch_missiles() { /*...*/ } void test_missiles() { enable_missile_safety_mode(); // 컴파일러가 nodiscard 값을 버리는 것에 대해 경고할 수 있음 launch_missiles(); } error_info& foo() { static error_info e; /*...*/ return e; } void f1() { foo(); } // nodiscard 타입이 값으로 반환되지 않음, 경고 없음 // nodiscard( 문자열 리터럴 ) (C++20부터): [[nodiscard("PURE FUN")]] int strategic_value(int x, int y) { return x ^ y; } int main() { strategic_value(4, 2); // 컴파일러가 nodiscard 값을 버리는 것에 대해 경고할 수 있음 auto z = strategic_value(0, 0); // OK: 반환 값이 버려지지 않음 return z; }
가능한 출력:
game.cpp:5:4: warning: ignoring return value of function declared with ⮠ 'nodiscard' attribute game.cpp:17:5: warning: ignoring return value of function declared with ⮠ 'nodiscard' attribute: PURE FUN
표준 라이브러리
다음 표준 함수들은
|
(C++26까지) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| P1771R1 | C++17 |
[[nodiscard]]
생성자에서 효과 없음
|
생성된 객체가 폐기될 경우 경고 발생 가능 |
참고문헌
- C++23 표준 (ISO/IEC 14882:2024):
-
- 9.12.9 Nodiscard 속성 [dcl.attr.nodiscard]
- C++20 표준(ISO/IEC 14882:2020):
-
- 9.12.8 Nodiscard 속성 [dcl.attr.nodiscard]
- C++17 표준 (ISO/IEC 14882:2017):
-
- 10.6.7 Nodiscard 속성 [dcl.attr.nodiscard]
참고 항목
|
(C++11)
|
tuple
을
tie
로 unpack할 때 요소를 건너뛰기 위한 플레이스홀더
(상수) |
|
C 문서
for
nodiscard
|
|