在逗号分隔列表中使用`void()`?

时间:2017-09-13 13:16:28

标签: c++

当我看到这个时,我正在查看其他人编写的代码:

a(), void(), b();

其中ab都是用户定义的模板类的实例,其意图通过重载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()有什么作用?我觉得很奇怪。

1 个答案:

答案 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