gpt4 book ai didi

C++ 单线。在同一行上构造对象和调用函数是否合法

转载 作者:行者123 更新时间:2023-12-03 06:51:38 30 4
gpt4 key购买 nike

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

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 是一个右值,它也会在堆栈上构造,并且 's' 将指向有效数据。
但是,对于 GCC(版本 7.5 和 9),缓冲区永远不会被初始化。
编译失败示例:
g++-9 --std=c++11 -Wall -pedantic -O3 -o example example.cpp

最佳答案

在这一行:

const char * s = foo(1234).bar();
s指向 char s[4]临时成员(member) foo目的。在完整表达式结束时,该对象死亡,并且 s现在指向无效内存。在下一行打印它会调用未定义的行为。

这里的问题是使用返回值 bar() .链式函数调用本身没问题,所以如果你直接在 printf 中使用表达式它定义明确:
printf("%s\n", foo(1234).bar());  // ok

关于C++ 单线。在同一行上构造对象和调用函数是否合法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63855915/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com