根据我的测试,返回类型推导失败似乎是编译错误而不是替换失败。以下示例给出了clang3.4的错误,其中-std = c ++ 1y。
#include <type_traits>
auto f = [](auto x){return x*2;};
template < typename X, typename=decltype(f(std::declval<X>())) >
std::true_type test_impl(int);
template < typename >
std::false_type test_impl(...);
template < typename T >
using test = decltype(test_impl<T>(0));
struct A{};
int main(int argc, const char * argv[])
{
static_assert(not test<A>{},"");
return 0;
}
错误如下:
main.cpp:3:29: error: invalid operands to binary expression ('A' and 'int')
auto f = [](auto x){return x*2;};
为了获得替换失败,我不得不将f
更改为
auto f = [](auto x) ->decltype(x*2) {return x*2;};
通过在尾随的decltype中重复return语句。
但是,自动返回类型推导(在c ++ 14中的lambdas和普通函数中)是不是要消除像这样的代码重复?
有没有人有更好的解决方法?
感谢。