编辑:我觉得现在有点傻了。发布的代码实际上与??? = decltype(acc(base(i)))
一起工作......错误是另一回事 - 虽然非常混乱。我将发布a new question。谢谢你的帮助。
我有一些像这样的代码:
template<typename Base, typename Acc>
struct Foo
{
Base base;
Acc acc;
auto operator()(unsigned i) const -> decltype(???) // what is ???
{ return acc(base(i)); }
};
如何获得正确的返回类型?
我尝试使用decltype(acc(base(i)))
,但这会产生错误(使用GCC 4.6.3):
“base”没有依赖于模板参数的参数, 所以必须提供“基础”声明
答案 0 :(得分:2)
我一直困扰这些问题好几个小时或几天。通常gcc想要this->
,但clang不会。在某些情况下Foo::
也有帮助,但有些情况下我放弃了使用成员名称。以下仅使用类型名称和(虽然更详细)我认为不会有任何问题:
template<typename Base, typename Acc>
struct Foo
{
Base base;
Acc acc;
template<typename S>
using result = typename std::result_of<S>::type;
auto operator()(unsigned i) const
-> result<const Acc(result<const Base(unsigned)>)>
{ return acc(base(i)); }
};
更一般地说,只要decltype(member_name)
导致问题,您就可以安全地使用decltype(std::declval<member_type>())
member_type
const
- 如果使用它的成员函数是const
则是合格的}。
更一般地说,如果您的成员函数为&&
,&
或const&
,请使用member_type
,member_type&
或{{1分别在这样的表达式中。
我从未研究过标准所说的内容,但实际上编译器在类成员的尾随返回类型和内部函数定义中对表达式的处理方式不同。