Шаблон игнорирует атрибут [[nodiscard]] - PullRequest
0 голосов
/ 20 ноября 2018

При применении к функции атрибут [[nodiscard]] побуждает компилятор выдавать предупреждение, если он используется в отброшенном выражении, отличном от приведения к void.Пример:

[[nodiscard]] int callable_return_not_discardable(int n)
{ return n; }

int main()
{
    callable_return_not_discardable(0); // warning/error:
        // ignoring return value of 'int callable_return_not_discardable(int)',
        // declared with attribute nodiscard [-Wunused-result]
    (void) callable_return_not_discardable(0); // OK
}

Демонстрация в реальном времени на gcc-8 и clang-7 .


Это приятно и полезно, покадобавлен дополнительный косвенный слой: шаблоны:

template<class Callable>
void invoke_with_answer(Callable&& callable)
{ callable(42); }

[[nodiscard]] int callable_return_not_discardable(int n)
{ return n; }

int main()
{
    invoke_with_answer(callable_return_not_discardable); // OK
}

Live демо на gcc-8 и clang-7 .

Мой вопросзатем:
Это отсутствующая функция, следствие того, что шаблоны должны или должны быть исправлены clang и gcc для выдачи здесь предупреждения?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Как объясняет StorryTeller , [[nodiscard]] не является частью сигнатуры или типа функции, поэтому эта информация теряется в контексте тела шаблона.

Решениечтобы получить это предупреждение, нужно добавить атрибут [[nodiscard]] к типу возврата этой функции:

template<class Callable>
void invoke_with_answer(Callable&& callable)
{ callable(42); } // warning

struct [[nodiscard]] Int { int value; };

Int callable_return_not_discardable(int n)
{ return {n}; }

int main()
{
    invoke_with_answer(callable_return_not_discardable); // note
}

Демонстрация в реальном времени на gcc-8

0 голосов
/ 20 ноября 2018

[[nodiscard]] не является частью сигнатуры или типа функции и совсем не сохраняется, когда указанная функция преобразуется в указатель или связана со ссылкой.Именно это и делает ваш пример.

Шаблон, для всех намерений и целей, не может "видеть" атрибут.

...