У меня есть функциональный объект, который является оберткой вокруг другой функции:
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
, он просто игнорируется моим компилятором.
Это поведение, на которое я могу положиться, оно каким-либо образом стандартизировано?