【发布时间】:2014-10-10 01:43:56
【问题描述】:
当我跳过表达式的返回类型时
C++11中的以下代码:
auto function(X x, Y y) -> decltype(x + y)
{
return x + y;
}
等于C++14中的如下代码:
decltype(auto) function(X x, Y y)
{
return x + y;
}
但另外,可以在 C++14 中推断出没有decltype 规则的返回类型:
auto function()
{
return 0;
}
当我知道返回类型究竟是什么时
C++11中的以下代码:
auto function() -> int
{
return 0;
}
等于C++03中的如下代码:
int function()
{
return 0;
}
一个不应该发生的奇怪例子
C++11中的以下代码:
auto function(X x, Y y) -> decltype(x * y)
{
return x; // Yeah! return x with the type of x * y expression!
}
等于C++14中的如下代码:
decltype(auto) function(X x, Y y)
{
return static_cast<decltype(x * y)>(x);
}
如果上面的代码有错误并且不能按预期工作,请纠正我。
EDIT,根据评论(Yakk):它们并不真正相等,第一个(C++11示例)是隐式转换而第二个(C++14 示例的static_cast)是显式转换。
结论
如您所见,我可以在不使用 C++11 的 替代函数语法 特性的情况下完成所有操作。我对么?我可以完全忘记它而不会遇到任何技术问题吗?
一般来说,可以避免以下语法:
auto function() -> TYPE
{
return 0;
}
赞成以下语法:
TYPE function() // TYPE can be: auto, decltype(auto), or ...
{
return 0;
}
我是否忘记了 C++11 的 尾随返回类型 特性的任何用法,而 C++14 的 函数返回类型推导 特性是不可能的?
【问题讨论】:
-
SFINAE!!?我没听说过!现在应该搜索它:-D
-
static_cast不是隐式转换。它可以更强大。例如,如果x*y返回类型Q*,如果U*类型返回X,并且Q是U的派生类,那么auto function(X x, Y y) -> decltype(x*y) { return x; }不同于auto function( X x, Y y ) { return static_cast<decltype(x*y)>(x); }——一个编译,另一个不编译。
标签: c++ c++11 c++14 trailing-return-type return-type-deduction