对于自动类型推导的参数,decltype(auto)应该推导出什么?

时间:2017-04-20 09:16:09

标签: c++ c++-concepts type-deduction type-declaration

我认为这两个函数应该具有相同的返回类型:

template<class T>
decltype(auto) f(T&& a){return a;}
decltype(auto) g(auto&& a){return a;}

然而,使用gcc7,这些函数验证:

int i;
static_assert(std::is_same< decltype(f(i)), int& >::value);
static_assert(std::is_same< decltype(g(i)), int  >::value);

为什么g和f的返回类型不同?

1 个答案:

答案 0 :(得分:2)

定义

decltype(auto) g(auto&& a){return a;}

不是标准C ++。它可能是即将推出的Concepts Lite功能的一部分。 g ++提供语法作为扩展(即使没有-fconcepts

使用-Wpedantic进行编译实际上会产生警告:

warning: ISO C++ forbids use of 'auto' in parameter declaration [-Wpedantic]
 decltype(auto) g(auto&& a){return a;}
                  ^~~~

由于行为尚未标准化,目前尚不清楚您的static_assert是否应该是真实的 - 直觉上我同意decltype(g(i))应该是int&。这可能只是g ++如何实现非成员函数 auto参数的“缺陷”。

与您正在尝试做的最接近标准的事情是 lambda表达式

auto z = [](auto&& a) -> decltype(auto) { return a; };

对于zstatic_assert按预期工作:

static_assert(std::is_same< decltype(z(i)), int&  >::value);