当我看到这个时,我正在查看其他人编写的代码:
a(), void(), b();
其中a
和b
都是用户定义的模板类的实例,其意图通过重载operator()
来执行函数,返回调用实例本身。
课程的一部分:
template <typename T>
class SomeClass{
public:
SomeClass& operator()(void);
const SomeClass& operator()(void) const;
}
两个重载的返回语句如下:
template <typename T>
SomeClass<T>& SomeClass<T>::operator()(void){
// do stuff
return *this;
}
template <typename T>
const SomeClass<T>& SomeClass<T>::operator()(void) const{
// do stuff
return *this;
}
他们之间void()
有什么作用?我觉得很奇怪。
答案 0 :(得分:46)
void()
阻止调用重载的operator,
(其中一个参数属于SomeClass<T>
类型),因为这样的重载不能具有类型{的参数{1}}。
您最常在模板中看到这个,并用于可变参数包扩展:
void
重载// C++11/14:
int unpack[] = {0, (do_something(pack), void(), 0)...};
// C++17 (fold expression):
(void(do_something(pack)), ...);
可能会破坏语言的sequencing guarantees。