'auto f(params) - > decltype(...,void())'中的'void()'有什么作用?

tem*_*boy 53 c++ decltype sfinae c++11 trailing-return-type

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

auto f(T& t, size_t n) -> decltype(t.reserve(n), void()) { .. }
Run Code Online (Sandbox Code Playgroud)

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

decltype( entity )

要么

decltype( expression )

任何地方都没有第二个论点.至少这是cppreference所指出的.这是第二个参数decltype吗?如果是这样,它会做什么?

Pub*_*bby 71

因为它是一个表达式,逗号只是逗号运算符(意​​思是类型是rhs side的类型:) void,而不是另一个参数.

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

  • @Klaim:这比SFINAE通常最终在C++ 11之前更好. (10认同)
  • OMG我们非常需要语言结构,而不必编写这样的hacky技巧!O__O ;;; (9认同)
  • @templateboy:逗号运算符总是出现在最意想不到的地方;) (5认同)
  • @BenVoigt我同意,但这更加模糊! (2认同)