decltype(auto) 应该为自动类型推导的参数推导什么?
What should be deduced by decltype(auto) for automatically type deduced argument?
我认为这两个函数应该具有相同的 return 类型:
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 的 return 类型不同?
定义
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
参数的 "defect"。
与您尝试做的事情最接近标准的是 lambda 表达式:
auto z = [](auto&& a) -> decltype(auto) { return a; };
在 z
的情况下,static_assert
按预期工作:
static_assert(std::is_same< decltype(z(i)), int& >::value);
我认为这两个函数应该具有相同的 return 类型:
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 的 return 类型不同?
定义
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
参数的 "defect"。
与您尝试做的事情最接近标准的是 lambda 表达式:
auto z = [](auto&& a) -> decltype(auto) { return a; };
在 z
的情况下,static_assert
按预期工作:
static_assert(std::is_same< decltype(z(i)), int& >::value);