首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++一条龙.在同一行上构造对象并调用函数是否合法?

C++一条龙.在同一行上构造对象并调用函数是否合法?
EN

Stack Overflow用户
提问于 2020-09-12 00:59:32
回答 1查看 73关注 0票数 4

此代码似乎在一个启用优化的广泛使用的编译器上中断,尽管它在Visual中运行良好。

代码语言:javascript
复制
struct foo
{
    foo(int a) { s[0] = '0'+a%10;s[1] = '\0'; }
    const char * bar() const { return &s[0]; }
    char s[4];
};

int main( )
{
    const char * s = foo(1234).bar();
    printf("%p %s\n", s, s);
}

我希望即使foo是一个rvalue,它也将在堆栈上构建,并且's‘将指向有效的数据。但是,使用GCC ( 7.5和9版本)时,缓冲区永远不会初始化。

示例失败的编译行:

代码语言:javascript
复制
g++-9 --std=c++11 -Wall -pedantic -O3 -o example example.cpp
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-12 01:07:55

在这条线上:

代码语言:javascript
复制
const char * s = foo(1234).bar();

s指向临时foo对象的char s[4]成员。在完整表达式的末尾,该对象将消失,s现在指向无效内存。在下一行上打印它将调用未定义的行为。

这里的问题是使用bar()的返回值。链式函数调用本身很好,因此,如果直接在printf中使用表达式,则定义得很好:

代码语言:javascript
复制
printf("%s\n", foo(1234).bar());  // ok
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63855915

复制
相关文章

相似问题

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