다음을 통해 공유


컴파일러 경고(수준 1) C4834

'nodiscard' 특성이 포함된 함수의 반환 값을 버립니다.

설명

C++17 Standard [[nodiscard]] 부터 특성은 함수의 반환 값이 삭제되지 않도록 지정합니다. 호출자가 반환 값을 삭제하면 컴파일러는 경고 C4834를 생성합니다. 이 특성은 C++17에서 도입되었지만 컴파일러는 이 특성을 준수하고 사용 /std:c++14 중 이상일 때 이와 관련된 경고를 생성합니다.

이 경고를 해결하려면 코드에서 반환 값을 사용하지 않는 이유를 고려합니다. 함수 사용이 의도와 일치하지 않을 수 있습니다. 값을 할당하거나 값을 std::ignore 삭제하는 것이 의도적인 경우 캐스팅하여 경고를 우회할 void 수 있습니다.
std::ignore C++11 이상으로 캐스팅하는 void 대신 할당을 사용하는 것이 좋습니다. 의도를 명확히 하고 코드 분석 설정에서 사용하도록 설정된 경우 경고 C26457을 트리거하지 않으므로 권장됩니다.

이 경고는 Visual Studio 2017 버전 15.3에서 수준 3 경고로 도입되었습니다. Visual Studio 2017 버전 15.7에서 수준 1 경고로 변경되었습니다. Visual Studio 2017 버전 15.3 이전 버전의 컴파일러에서 경고 없이 컴파일된 코드는 이제 C4834를 생성할 수 있습니다. 특정 컴파일러 버전 이상에서 도입된 경고를 사용하지 않도록 설정하는 방법에 대한 자세한 내용은 컴파일러 버전별 컴파일러 경고를 참조하세요.

코드를 변경하지 않고 경고를 끄려면

pragma#pragma warning(suppress : 4834)를 사용하여 warning 특정 코드 줄에 대한 경고를 끌 수 있습니다. 경고 pragma #pragma warning(disable : 4834)를 사용하여 파일 내에서 경고를 끌 수도 있습니다. 명령줄 옵션을 사용하여 /wd4834 명령줄 빌드에서 전역적으로 경고를 끌 수 있습니다.

Visual Studio IDE에서 전체 프로젝트에 대한 경고를 해제하려면 다음을 수행합니다.

  1. 프로젝트에 대한 속성 페이지 대화를 엽니다. 속성 페이지 대화 상자를 사용하는 방법에 대한 자세한 내용은 속성 페이지를 참조하세요.
  2. 구성 속성>C/C++>고급 페이지를 선택합니다.
  3. 특정 경고 사용 안 함 속성을 편집하여 4834을(를) 추가합니다. 확인을 선택하여 변경 내용을 적용합니다.

예시

이 샘플에서는 C4834를 생성하고 이를 해결하는 네 가지 방법을 보여 줍니다.

// C4834.cpp
// compile using: cl /EHsc /std:c++17
#include <iostream>

[[nodiscard]]
int square_of(int i) { return i * i; }

int main()
{
    square_of(42); // warning C4834: discarding return value of function with 'nodiscard' attribute
    // If ignoring the [[nodiscard] attribute is unintentional, make use of the return value as intended:
    // For example:
    std::cout << "square_of(42) = " << square_of(42) << "\n"; // Ok
    // Or:
    int result = square_of(43); // Ok
    std::cout << "square_of(43) = " << result << "\n"; 

    // If ignoring the [[nodiscard]] attribute value is intentional, you have two options:
    // Preferrably, assign the return value to std::ignore:
    std::ignore = square_of(42); // Ok, C++11 and higher
    // Alternatively, you can cast the return value to void. 
    // The intent may be less clear to other developers.
    (void) square_of(42); // May produce warning C26457
    return 0;
}