C++ Dilinde [[nodiscard]] attribute
- Yusuf Hançar
- Feb 21
- 2 min read
C++’ta [[attribute]] (öznitelik) mekanizması, kod hakkında ek bilgi sağlayarak derleyicinin uyarılar vermesine, belirli optimizasyonlar yapmasına veya kodu daha okunabilir hale getirmesine yardımcı olur.
Özniteliklerin Faydaları:
✅ Koruma Mekanizması:
Derleyicinin belirli durumlar için uyarı vermesini sağlayabilir.
✅ Kod Okunurluğu:
Kodun amacını daha net hale getirerek geliştiricilere rehberlik eder.
✅ Performans Optimizasyonu:
[[likely]], [[unlikely]] gibi öznitelikler, derleyicinin dallanma tahminini optimize etmesine yardımcı olabilir.
Kullanımı
Öznitelikler her zaman [[ ... ]] şeklinde yazılır.
[[nodiscard]]
https://en.cppreference.com/w/cpp/language/attributes/nodiscard
logic bir öğenin discard edilmesinin logic bir hata olduğunu ifade eder.
c++11
nodiscard olarak tanımlanan bir fonksiyon veya değere göre nodiscard olarak tanımlanan bir enumeration veya class döndüren bir fonksiyon, void'e dönüştürme dışında bir discard edilen değer ifadesinden çağrılırsa, compiler bir uyarı vermesi önerilir.
[[nodiscard]] int foo(int);
[[nodiscard ("foo should be return a value")]] int foo(int);
*****************************
AÇIKLAMA : c++17
*****************************
türleri de niteleyebilir.
class [[nodiscard]] Data {};
Data foo()
{
return Data{};
}
int main ()
{
auto val = foo();
}
*****************************
AÇIKLAMA : [[nodiscard]] bir sınıfa uygulandığında, bu sınıftan döndürülen bir nesne kullanılmazsa derleyici uyarı verecektir.
Burada Data sınıfına [[nodiscard]] eklediğimiz için, eğer foo() fonksiyonundan dönen nesneyi kullanmazsak derleyici bir uyarı verecektir.
Ancak, auto val = foo(); satırında dönen değer bir değişkene atanarak kullanıldığı için uyarı oluşmaz.
*****************************
CEVAP : legal
*****************************
class [[nodiscard]] Data {};
Data foo()
{
return Data{};
}
int main ()
{
foo();
}
*****************************
CEVAP : derleyici uyarı verir...
*****************************
enum [[nodiscard]] Planets
{
Mercury,
Venus,
Mars,
Earth
};
Planets foo();
int main ()
{
foo();
}
*****************************
AÇIKLAMA : UYARI: 'nodiscard' özniteliği nedeniyle dönüş değeri kullanılmalı
*****************************
CEVAP : derleyici uyarı verdi.
*****************************
Sınıfların üye fonksiyonları da [[nodiscard]] olarak nitelenebilir
class Data {
public :
[[nodiscard]] int foo()
{
return 1;
}
};
int main ()
{
Data val;
val.foo();
}
*****************************
CEVAP : derleyici uyarı verir...
*****************************
implicitly olarak kullanmak uyarı verilmesini gerektirmez.
[[nodiscard]] int foo()
{
return 1;
}
int main ()
{
if (foo())
{
cout << "foo";
}
}
*****************************
AÇIKLAMA : Dönüş değeri doğrudan koşulda kullanılıyor
*****************************
CEVAP : derleyici uyarı vermez.
*****************************
int main ()
{
std::vector vec{ 3, 5, 8, 6 };
std::max_element(vec.begin(), vec.end());
}
*****************************
AÇIKLAMA : std::max_element() fonksiyonunun dönüş değerini kullanmadığınız için derleyicinin uyarı verir
*****************************
CEVAP : derleyici uyarı verir...
*****************************
Sınıfların kurucu işlevleri(constructor) [[nodiscard]] olarak nitelenebilir
class Data {
public :
Data(int){}
};
int main ()
{
Data{ 10 };
}
*****************************
CEVAP : derleyici uyarı vermez
*****************************
class Data {
public :
[[nodiscard]] Data(int){}
};
int main ()
{
Data{ 10 };
}
*****************************
CEVAP : derleyici uyarı verir...
*****************************
class Data {
public :
[[nodiscard]] Data(int){}
};
int main ()
{
static_cast<Data>(10);
}
*****************************
AÇIKLAMA : c++20
*****************************
CEVAP : derleyici uyarı verir...
*****************************
Fonksiyonun return değeri reference ya da pointer ise geri dönüş değerini kullanmak zorunda değildir.
class Data {};
Data& foo();
int main ()
{
foo();
}
*****************************
CEVAP : derleyici uyarı vermez.
*****************************
Comments