为什么"返回(str);"演绎出一种不同于"返回str;"?

时间:2018-06-04 05:45:45

标签: c++ c++14 decltype return-type-deduction

案例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);给出了细分错误?

1 个答案:

答案 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。