应用于函数时,[[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
}
这很好用,直到添加了一个额外的间接层:模板:
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
}
那么我的问题是:
这是缺少的功能,是什么模板的结果,还是应该修复 clang 和 gcc 以在此处发出警告?
最佳答案
[[nodiscard]]
不是函数签名或类型的一部分,并且当所述函数转换为指针或绑定(bind)到引用时根本不会保留。这正是您的示例所做的。
模板,无论出于何种意图和目的,都无法“看到”属性。
关于c++ - 模板忽略 [[nodiscard]] 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53391788/