원문 캡처 · giodicanio.com
원문 캡처 · giodicanio.com

MSVC에서는 C++ 함수 선언에서 [[nodiscard]]를 static 뒤에 두면 반환값을 버려도 경고가 나오지 않을 수 있다. Visual Studio 2022에서 C++20 모드와 /W4로 컴파일한 사례에서는 속성을 static 앞에 두자 경고가 발생했다.

다음처럼 속성을 static 뒤에 두면 함수의 반환값을 사용하지 않아도 MSVC에서 코드가 컴파일된다.

cpp
static [[nodiscard]] int GetSomething()
{
 return 64;
}
cpp
int main()
{
 GetSomething();
}

이 사례에서는 경고 수준을 4로 설정해도 경고가 나오지 않았다. 속성 위치를 바꿔 static 앞에 두면 MSVC가 반환값을 버렸다는 경고 C4834를 표시한다.

cpp
// Was: 
// static [[nodiscard]] int GetSomething()
//
// Now put [[nodiscard]] at the beginning of the line,
// before "static":
//
[[nodiscard]] static int GetSomething()
{
 return 64;
}

자료에 따르면 Clang과 GCC는 [[nodiscard]]가 잘못된 위치에 있는 코드를 거부하지만, MSVC는 이를 조용히 받아들인다. MSVC를 사용한다면 속성을 static 앞에 배치해야 반환값을 버릴 때 경고를 받을 수 있다.