У меня есть следующий код, использующий атрибут [[nodiscard]]
С++ 17.
class SomeClass {
public: /** Methods **/
[[nodiscard]] int getValue() { return n; }
[[nodiscard]] int &getRef() { return n; }
[[nodiscard]] int *getPtr() { return &n; }
private: /** Members **/
int n{5};
};
int main()
{
SomeClass object;
object.getValue();
object.getRef();
object.getPtr();
return 0;
}
Когда я компилирую его с ССЗ 7.3, у меня есть два предупреждения о том, что возвращаемое значение двух функций игнорируется. Компилятор обнаружил две функции, которые не возвращают ссылку, getValue()
и getPtr()
.
С другой стороны, при компиляции с версиями ССЗ 8.1 и выше getRef()
также вызывает предупреждение.
Таблица поддержки С++, предоставленный GCC, показывает, что атрибут [[nodiscard]]
полностью поддерживается с версии 7. Он также имеет белый бумага.
Appearance of a
[[nodiscard]]
call as a potentially evaluated discarded value expression is discouraged unless explicitly cast to void.
Так это баг или я что-то пропустил?
Да, это ошибка. Это было исправлено в GCC 8, как вы уже поняли.
Отчет об ошибке: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80896
То же самое для gcc v7.5.