Bagikan melalui


Peringatan kompiler (level 1) C4834

membuang nilai pengembalian fungsi dengan atribut 'nodiscard'

Keterangan

Mulai dari Standar C++17, [[nodiscard]] atribut menentukan bahwa nilai pengembalian fungsi tidak dimaksudkan untuk dibuang. Jika penelepon membuang nilai pengembalian, pengkompilasi menghasilkan peringatan C4834. Meskipun atribut ini diperkenalkan di C++17, pengompilasi menghormati atribut ini dan menghasilkan peringatan yang terkait dengannya saat menggunakan /std:c++14 dan nanti.

Untuk mengatasi peringatan ini, pertimbangkan mengapa kode Anda tidak menggunakan nilai pengembalian. Penggunaan fungsi Anda mungkin tidak cocok dengan niatnya. Anda dapat menghindari peringatan dengan menetapkan nilai ke std::ignore atau dengan mentransmisikannya void jika membuang nilai disengaja.
Penugasan ke std::ignore lebih disukai daripada transmisi void di C++11 dan yang lebih tinggi, karena membuat niat Anda lebih jelas dan tidak akan memicu Peringatan C26457 jika diaktifkan di pengaturan analisis kode Anda.

Peringatan ini diperkenalkan di Visual Studio 2017 versi 15.3 sebagai peringatan tingkat 3. Ini diubah menjadi peringatan tingkat 1 di Visual Studio 2017 versi 15.7. Kode yang dikompilasi tanpa peringatan dalam versi pengkompilasi sebelum Visual Studio 2017 versi 15.3 sekarang dapat menghasilkan C4834. Untuk informasi tentang cara menonaktifkan peringatan yang diperkenalkan dalam versi pengompilasi tertentu atau yang lebih baru, lihat Peringatan pengompilasi berdasarkan versi kompilator.

Untuk menonaktifkan peringatan tanpa perubahan kode

Anda dapat menonaktifkan peringatan untuk baris kode tertentu dengan menggunakan warning pragma, #pragma warning(suppress : 4834). Anda juga dapat menonaktifkan peringatan dalam file dengan menggunakan pragma peringatan, #pragma warning(disable : 4834). Anda dapat menonaktifkan peringatan secara global dalam build baris perintah dengan menggunakan /wd4834 opsi baris perintah.

Untuk menonaktifkan peringatan untuk seluruh proyek di IDE Visual Studio:

  1. Buka dialog Halaman Properti untuk proyek Anda. Untuk informasi tentang cara menggunakan dialog Halaman Properti, lihat Halaman Properti.
  2. Pilih halaman Properti>Konfigurasi C/C++>Tingkat Lanjut.
  3. Edit properti Nonaktifkan Peringatan Tertentu untuk menambahkan 4834. Pilih OK untuk menerapkan perubahan Anda.

Contoh

Sampel ini menghasilkan C4834, dan menunjukkan empat cara untuk memperbaikinya:

// 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;
}