代码之家  ›  专栏  ›  技术社区  ›  msc

为什么“return(str);”推导的类型与“return str;”不同?[副本]

  •  10
  • msc  · 技术社区  · 6 年前

    案例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 回复  |  直到 6 年前
        1
  •  15
  •   songyuanyao    6 年前

    decltype 以两种不同的方式工作;当与未绑定的id表达式一起使用时,它会产生声明它的确切类型(在案例1中 std::string )。否则,

    如果参数是t类型的任何其他表达式,并且

    a)如果表达式的值类别是xvalue,则decltype将生成 T&公司

    b)如果表达式的值类别是左值,则decltype将生成 T&

    c)如果表达式的值类别是prvalue,则decltype 产量t。

    注意,如果对象的名称用括号括起来,则将其视为普通的左值表达式,因此 decltype(x) decltype((x)) 通常是不同的类型。

    (str) 是一个带圆括号的表达式,它是左值;然后它生成 string& . 所以返回一个对局部变量的引用,它总是被挂起的。它的解引用导致ub。