应该返回类型扣除失败是替换失败?

时间:2014-06-21 23:11:40

标签: c++ lambda auto sfinae

根据我的测试,返回类型推导失败似乎是编译错误而不是替换失败。以下示例给出了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和普通函数中)是不是要消除像这样的代码重复?

有没有人有更好的解决方法?

感谢。

0 个答案:

没有答案