c++ - 模板忽略 [[nodiscard]] 属性

标签 c++ gcc clang language-lawyer c++17

应用于函数时,[[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-8clang-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
}

现场演示 gcc-8clang-7 .

那么我的问题是:
这是缺少的功能,是什么模板的结果,还是应该修复 clang 和 gcc 以在此处发出警告?

最佳答案

[[nodiscard]] 不是函数签名或类型的一部分,并且当所述函数转换为指针或绑定(bind)到引用时根本不会保留。这正是您的示例所做的。

模板,无论出于何种意图和目的,都无法“看到”属性。

关于c++ - 模板忽略 [[nodiscard]] 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53391788/

相关文章:

python - 在 libclang (Python) 中查找特定函数声明的所有引用

c++ - 如何使用 rapidjson 更新数组?

c - 从 C 代码构建 AST

c++ - 为什么隐式转换在 g++ 中不起作用

带有继承的 C++11 代码不能用 clang 编译

c - 从 c/cpp 文件中获取所有函数的名称

c++ - C++中类型和类之间的区别?

c++ - 如何从 Gdiplus::Bitmap 快速复制数据

c++ - 不同函数名称的预处理器宏

gcc - 设置自动工具以静态链接单个系统库