首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么“返回(str);”推断出与C++中的“返回str;”不同的类型?

为什么“返回(str);”推断出与C++中的“返回str;”不同的类型?
EN

Stack Overflow用户
提问于 2018-06-04 05:45:45
回答 1查看 709关注 0票数 13

案例1:

代码语言:javascript
复制
#include <iostream>

decltype(auto) fun()
{
        std::string str = "In fun";
        return str;
}

int main()
{
        std::cout << fun() << std::endl;
}

在这里,程序在Gcc编译器中运行得很好。decltype(auto)str的一种类型。

案例2:

代码语言:javascript
复制
#include <iostream>

decltype(auto) fun()
{
        std::string str = "In fun";
        return (str); // Why not working??
}

int main()
{
        std::cout << fun() << std::endl;
}

这里,生成跟随错误和分割故障

代码语言:javascript
复制
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);会产生分割错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-04 05:50:46

decltype以两种不同的方式工作;当使用不带括号的id-表达式时,它会得到声明它的确切类型(在第1种情况下,它是std::string)。否则,

如果参数是T类型的任何其他表达式,并且 如果表达式的值类别为x值,则解密类型将产生T&; b)如果表达式的值范畴为lvalue,则解密类型产生T&; c)如果表达式的值类别为prvalue,则解密类型将产生T。

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

(str)是一个带括号的表达式,它是一个lvalue;然后它生成string&的类型。所以你要返回一个局部变量的引用,它总是在悬空中。会导致UB的出现。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50674046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档