我最近在玩 CRTP,当我在使用 c++1y 类型推断的函数时遇到了一些令我惊讶的事情。以下代码有效:
template<typename Derived>
struct Base
{
auto foo()
{
return static_cast<Derived*>(this)->foo_impl();
}
};
struct Derived:
public Base<Derived>
{
auto foo_impl()
-> int
{
return 0;
}
};
int main()
{
Derived b;
int i = b.foo();
(void)i;
}
我假设 from 的返回类型Base<Derived>::foo
是decltype
返回的表达式的 a ,但是如果我像这样修改函数foo
:
auto foo()
-> decltype(static_cast<Derived*>(this)->foo_impl())
{
return static_cast<Derived*>(this)->foo_impl();
}
此代码不再起作用,我收到以下错误(来自 GCC 4.8.1):
||In instantiation of 'struct Base<Derived>':|
|required from here|
|error: invalid static_cast from type 'Base<Derived>* const' to type 'Derived*'|
||In function 'int main()':|
|error: 'struct Derived' has no member named 'foo'|
我的问题是:为什么它不起作用?在不依赖自动返回类型扣除的情况下,我可以写什么来获得正确的返回类型?
而且,嗯……这是一个活生生的例子。