案例1:
#include <iostream>
decltype(auto) fun()
{
std::string str = "In fun";
return str;
}
int main()
{
std::cout << fun() << std::endl;
}
这里,程序在Gcc编译器中工作正常。 decltype(auto)
被推断为str
的类型。
案例2:
#include <iostream>
decltype(auto) fun()
{
std::string str = "In fun";
return (str); // Why not working??
}
int main()
{
std::cout << fun() << std::endl;
}
此处,生成以下错误和细分错误:
In function 'decltype(auto) fun()':
prog.cc:5:21: warning: reference to local variable 'str' returned [-Wreturn-local-addr]
std::string str = "In fun";
^~~
Segmentation fault
为什么return (str);
给出了细分错误?
答案 0 :(得分:15)
decltype
以两种不同的方式运作;当使用未加括号的id-expression时,它会产生确切的类型(如果是1,它是std::string
)。否则,
如果参数是T类型的任何其他表达式,并且
a)如果表达式的值类别是xvalue,则decltype产生 T&安培;&安培;;
b)如果表达式的值类别是左值,则decltype产生 T&安培;;
c)如果表达式的值类别是prvalue,则为decltype 收益率。
和
请注意,如果对象的名称带括号,则将其视为普通的左值表达式,因此
decltype(x)
和decltype((x))
通常是不同的类型。
(str)
是带括号的表达式,它是一个左值;然后它产生string&
的类型。因此,您将返回对局部变量的引用,它始终是悬空的。取消引用它会导致UB。