繁体   English   中英

模板参数依赖[[nodiscard]]

[英]Template parameter dependant [[nodiscard]]

我有一个功能对象,它是另一个函数的包装:

template <typename FuncT>
class Wrapper
{
    private:
        FuncT funcToWrap;

    public:
        Wrapper(FuncT ftw) : funcToWrap(ftw){};

        template<typename ...ARG>
        typename std::result_of<FuncT(ARG&&...)>::type operator()(ARG&&... args){
            return funcToWrap(std::forward<ARG>(args)...);
        }
};

int main(){
    std::function<void()> testfunc = [](){ std::cout << "Test" << std::endl; };
    Wrapper<decltype(testfunc)> test{testfunc};
    test();
}

如果std::result_of<FuncT(ARG&&...)>::type不为void我想做的是将operator()标记为[[nodiscard]]

我注意到的是,当我将[[nodiscard]]放在返回类型的模板评估为void ,它将被我的编译器忽略。

这是我可以依赖的行为,它是否以任何方式标准化?

[dcl.attr.nodiscard] / 2

[ 注意: nodiscard调用是一个函数调用表达式,它调用先前声明为nodiscard的函数,或者其返回类型是可能是cv限定的类或标记为nodiscard枚举类型。 除非明确转换为void否则不鼓励将nodiscard调用作为潜在评估的丢弃值表达式的外观。 在这种情况下,实施应该发出警告。 这通常是因为丢弃nodiscard呼叫的返回值具有令人惊讶的后果。 - 结束说明 ]

我对这一段的解读给出了这一点

[[nodiscard]] void f() {}

甚至

f();

应该发出警告。 您必须显式转换为void

(void) f();

压制它。 所以不,这不是标准所保证的。

在我看来,标准只是忽略了这一微妙之处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM