相关疑难解决方法(0)

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

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

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吗?如果是这样,它会做什么?

c++ decltype sfinae c++11 trailing-return-type

53
推荐指数
1
解决办法
3142
查看次数

为什么使用强制语法不调用"operator void"?

在用户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不使用强制语法调用?

c++ casting operator-overloading operators

40
推荐指数
1
解决办法
2700
查看次数

关于 decltype + 逗号技巧的完整故事

标题应该能澄清我的困惑。我想用这个问题来获得全面的答案,这有助于我理解逗号运算符如何decltype在 SFINAE 上下文中使用。我的这个问题中显示了一个示例用法。

\n

一点研究

\n

搜索is:question [c++] [decltype] comma,可以找到以下 6 个问题:

\n
    \n
  • (2011) How is decltype Should to work withoperator,有一个很有前途的标题,但它是 VisualStudio 特定的,并且唯一的答案从根本上声称编译器中确实存在错误。

    \n
  • \n
  • (2012)如何从自动返回类型推导出类型?接受的答案如下,参考表达式decltype( ( bool( fun(v[0] ) ), void() ) ),

    \n
    \n
      \n
    1. 该表达式实际上bool( fun(v[0] ) )并未被求值,因为我们处于非求值上下文中(,类似于)。这里重要的是,如果整个表达式被求值,它将被求值,因此,如果子表达式无效,则整个表达式也无效。decltypesizeof
    2. \n
    3. void()并不是真正的值,但它的行为类似于逗号运算符和上下文中的值decltype。
    4. \n
    \n
    \n

    我还没有真正理解。

    \n
  • \n
  • (2014) c++11 decltype …

c++ decltype sfinae comma-operator template-meta-programming

6
推荐指数
1
解决办法
433
查看次数