C ++ 11 decltype返回正确的类型,但代码没有编译

时间:2018-01-24 06:59:15

标签: c++ c++11 decltype

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

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

有人可以解释一下,我们有什么事吗?

1 个答案:

答案 0 :(得分:2)

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

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

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

如果明确指定t的类型,则不会将其视为依赖类型。

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