【问题标题】:C++11 decltype returns the right type, but code doesnt compileC++11 decltype 返回正确的类型,但代码无法编译
【发布时间】:2018-01-24 06:59:15
【问题描述】:

由于一些重要原因,我为微控制器编写了 std::function 的简单模拟。当我尝试测试我的代码时,出了点问题,我的编译器给出了一些关于 ')' 和 ',' 的错误等等。原因是使用关键字 decltype。我检查了 decltype 返回的类型,如 Meyers 所示。然后我将“decltype(...)”更改为 decltype deduct 类型,一切顺利。我在各种 GCC 版本的编译器资源管理器中检查了我的代码,一切都一样。

这是带有 decltype 的代码(第 102 行): https://godbolt.org/g/4xBkSP 这里是完整类型的相同代码(同一行): https://godbolt.org/g/Er9dFk

谁能解释一下,请问这是怎么回事?

【问题讨论】:

  • 请在此处发布代码,而不是代码链接。

标签: c++ c++11 decltype


【解决方案1】:

显然,在decltype 的情况下,编译器将t 的类型视为依赖类型。因此,您必须使用

t.template bind< typename Deref<decltype( *this )>::Type,
               decltype( &TemplateClassWithCallback::foo3 ),
               &TemplateClassWithCallback::foo3 >( *this );

引用成员模板bind的语法。注意bind之前的额外关键字template

当显式指定t 的类型时,它不会被视为依赖类型。

但是,根据 14.6.2.2/5,不应将此类成员访问表达式视为具有依赖类型,因为它引用具有非依赖类型的 当前实例化 的成员类型。然而,GCC 和 Clang 都同意在这种情况下需要 template 关键字。 (如果你用 Clang 编译它,它实际上会明确告诉你添加 template 关键字。)

【讨论】:

  • 我不明白为什么它是依赖类型。您能否提供一个标准报价来支持它?
  • 非常感谢!这是我使用关键字模板的一种非常新的方式)
  • @Johannes Schaub - litb:似乎 14.6.2.2/1 和 2 使其依赖,但如果我正确阅读 14.6.2.2/5,则根据 14.6.2.2/5 将其排除在外。奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多