使用C++14中的auto返回类型,编译器将尝试自动推导(deduce)返回类型:
namespace {
int xx = 1;
auto f() { return xx; } // return type is int
const auto& f3() { return xx; } // return type is const int&
auto multiply(int a, int b) { return (a * b); }
auto& increase(int& a) { a++; return a; }
} // namespace
int test_auto_14_1()
{
int a = 4, b = 5;
auto v1 = multiply(a, b);
std::cout << "v1:" << v1 << "\n"; // v1:20
auto& v2 = increase(a);
std::cout << "v2:" << v2 << "\n"; // v2:5
v2 = 10;
std::cout << "a:" << a << "\n"; // a:10
return 0;
}
在C++14中使用lambda,可以使用auto推导其返回类型,这使得返回推导引用或右值引用成为可能:
namespace {
template <typename T>
auto& f2(T& t) { return t; }
} // namespace
int test_auto_14_2()
{
// returns a reference to a deduced type
auto g = [](auto& x) -> auto& { return f2(x); };
int y = 123;
int& z = g(y); // reference to y
std::cout << "z:" << z << "\n"; // z:123
z = 456;
std::cout << "y:" << y << "\n"; // y:456
return 0;
}
decltype(auto)类型说明符(type-specifier)也像auto一样推导出一个类型。但是,它会在保留其引用和cv限定符(cv-qualifier)的同时推导返回类型,而auto则不会:
namespace {
decltype(auto) increase(int& a) { a++; return a; }
int xxx = 123;
auto f(const int& i) { return i; } // return type is "int"
static_assert(std::is_same<const int&, decltype(f(xxx))>::value == 0);
static_assert(std::is_same<int, decltype(f(xxx))>::value == 1);
decltype(auto) g(const int& i) { return i; } // return type is "const int&"
static_assert(std::is_same<const int&, decltype(g(xxx))>::value == 1);
int xx = 1;
decltype(auto) f2() { return xx; } // return type is int, same as decltype(x)
static_assert(std::is_same<int, decltype(f2())>::value == 1);
decltype(auto) f3() { return(xx); } // return type is int&, same as decltype((x))
static_assert(std::is_same<int&, decltype(f3())>::value == 1);
//const decltype(auto)& f4(const int) { return xx; } // "const decltype(auto)&" is an error, decltype(auto) must be used on its own
// error:“decltype(auto)”不能与任何其他类型说明符组合
//auto f5(bool flag) {
// if (flag) return 1;
// else return 1.0; // error: 所有返回表达式必须推导为相同类型: 以前为“int”
//}
//class AA {
// virtual auto g() { return 1; } // error: 虚成员函数不应具有含“auto”的返回类型
//};
} // namespace
int test_decltype_14_1()
{
int a = 4;
auto& v2 = increase(a);
std::cout << "v2:" << v2 << "\n"; // v2:5
v2 = 10;
std::cout << "a:" << a << "\n"; // a:10
return 0;
}
int test_decltype_14_2()
{
const int x = 0;
//x = 2; // error C3892: “x”: 不能给常量赋值
auto x1 = x; // int
x1 = 2;
decltype(auto) x2 = x; // const int
//x2 = 3; // error C3892: “x2”: 不能给常量赋值
int y = 2;
int& y1 = y;
auto y2 = y1; // int
y2 = 5;
std::cout << "y:" << y << "\n"; // y:2
decltype(auto) y3 = y1; // int&
y3 = 10;
std::cout << "y:" << y << "\n"; // y:10
int&& z = 2;
auto z1 = std::move(z); // int
z1 = 5;
std::cout << "z:" << z << "\n"; // z:2
decltype(auto) z2 = std::move(z); // int&&
z2 = 10;
std::cout << "z:" << z << "\n"; // z:10
return 0;
}
windows下debug模式结果如下:
注:
(1).const decltype(auto)&是一个error,decltype(auto)必须单独使用,它不能与任何其它类型说明符组合。
(2).函数返回类型为auto或decltype(auto):如果有多个return语句,它们必须全部推导出相同的类型,否则会编译error。
(3).虚函数不能使用返回类型推导。
C++11中auto的使用:https://blog.csdn.net/fengbingchun/article/details/51834927
C+11中decltype的使用:https://blog.csdn.net/fengbingchun/article/details/52504519
GitHub:https://github.com/fengbingchun/Messy_Test