[英]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
,它将被我的编译器忽略。
这是我可以依赖的行为,它是否以任何方式标准化?
[ 注意: nodiscard调用是一个函数调用表达式,它调用先前声明为
nodiscard
的函数,或者其返回类型是可能是cv限定的类或标记为nodiscard
枚举类型。 除非明确转换为void
否则不鼓励将nodiscard调用作为潜在评估的丢弃值表达式的外观。 在这种情况下,实施应该发出警告。 这通常是因为丢弃nodiscard呼叫的返回值具有令人惊讶的后果。 - 结束说明 ]
我对这一段的解读给出了这一点
[[nodiscard]] void f() {}
甚至
f();
应该发出警告。 您必须显式转换为void
如
(void) f();
压制它。 所以不,这不是标准所保证的。
在我看来,标准只是忽略了这一微妙之处。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.