【问题标题】:What does the 'void()' in 'auto f(params) -> decltype(..., void())' do?'auto f(params) -> decltype(..., void())' 中的 'void()' 有什么作用?
【发布时间】:2012-12-09 19:32:54
【问题描述】:

我发现代码 here 看起来像这样:

auto f(T& t, size_t n) -> decltype(t.reserve(n), void()) { .. }

在我阅读的所有文档中,我被告知decltype 的签名为:

decltype( entity )

decltype( expression )

而且任何地方都没有第二个参数。至少这就是cppreference 所指出的。这是decltype 的第二个参数吗?如果是这样,它有什么作用?

【问题讨论】:

    标签: c++ c++11 sfinae decltype trailing-return-type


    【解决方案1】:

    因为它是一个表达式,所以逗号只是逗号运算符(意​​味着类型是 rhs 侧的类型:void),而不是另一个参数。

    该代码正在使用 SFINAE - 如果 t.reserve(n) 存在则启用它,但它希望将返回类型保持为 void

    【讨论】:

    • @templateboy:逗号操作符总是出现在最意想不到的地方;)
    • 天啊,我们真的需要语言结构才能不必编写如此骇人听闻的技巧! O__O;;;
    • @Klaim:这比通常在 C++11 之前出现的 SFINAE 要好得多。
    • @BenVoigt 我同意,但这更晦涩!
    • @abigagli 是的,void 是一个不完整的类型,因此您不能在未评估的上下文(如 decltype()sizeof())之外的任何地方调用它的“构造函数”。
    猜你喜欢
    • 2017-01-09
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多