我发现这里的代码看起来像这样:
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吗?如果是这样,它会做什么?
在用户GMan使用此答案时,我制作了以下代码段(使用Visual C++ 9编译):
class Class {
public:
operator void() {}
};
Class object;
static_cast<void>( object );
(void)object;
object.operator void();
Run Code Online (Sandbox Code Playgroud)
在使用调试器踩到后,我发现转换为void不调用Class::operator void(),只有第三个invokation(显式调用运算符)实际上调用了运算符,两个转换只是什么都不做.
为什么operator void不使用强制语法调用?
标题应该能澄清我的困惑。我想用这个问题来获得全面的答案,这有助于我理解逗号运算符如何decltype在 SFINAE 上下文中使用。我的这个问题中显示了一个示例用法。
搜索is:question [c++] [decltype] comma,可以找到以下 6 个问题:
\n(2011) How is decltype Should to work withoperator,有一个很有前途的标题,但它是 VisualStudio 特定的,并且唯一的答案从根本上声称编译器中确实存在错误。
(2012)如何从自动返回类型推导出类型?接受的答案如下,参考表达式decltype( ( bool( fun(v[0] ) ), void() ) ),
\n\n\n
\n- 该表达式实际上
\nbool( fun(v[0] ) )并未被求值,因为我们处于非求值上下文中(,类似于)。这里重要的是,如果整个表达式被求值,它将被求值,因此,如果子表达式无效,则整个表达式也无效。decltypesizeof- \n
void()并不是真正的值,但它的行为类似于逗号运算符和上下文中的值decltype。
我还没有真正理解。
\n(2014) c++11 decltype …
c++ decltype sfinae comma-operator template-meta-programming