다음을 통해 공유


컴파일러 경고(수준 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를 생성할 수 있습니다. 특정 컴파일러 버전 이상에서 도입된 경고를 사용하지 않도록 설정하는 방법에 대한 자세한 내용은 컴파일러 버전별 컴파일러 경고를 참조하세요.

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

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

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

  1. 프로젝트에 대한 속성 페이지 대화를 엽니다. 속성 페이지 대화 상자를 사용하는 방법에 대한 자세한 내용은 속성 페이지를 참조하세요.
  2. > > 고급 페이지를 선택합니다.
  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;
}