【发布时间】:2018-11-20 11:14:31
【问题描述】:
当应用于函数时,[[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 以在此处发出警告?
【问题讨论】:
-
这与模板无关。如果您将第一行替换为
using Callable = int(int);,您将获得完全相同的行为。 行为是函数指针是什么的结果(参见 StoryTellers 的回答)。 -
@Handy 你好。在评论部分回复通常是不受欢迎的。如果您认为可以改进答案,请提出修改建议或自行回答。
标签: c++ gcc clang language-lawyer c++17