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

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();
}

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

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

这是我可以依靠的行为吗?

最佳答案

[dcl.attr.nodiscard]/2:



我对本段的阅读给出了

[[nodiscard]] void f() {}

甚至
f();

应该发出警告。您必须像下面这样显式转换为void
(void) f();

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

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

关于c++ - 模板参数相关[[nodiscard]],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56557786/

10-10 07:02