让我们考虑使用一个函数,该函数返回字符串的向量,并具有:
• 一个输出用空格分隔的字符串的循环,如上所述;
• 第二个循环,打印第一个字符串的字母,用空格分隔:
std::vector<std::string> createStrings() {
return { "Example”, "vector", "of", "strings" };
}
int main() {
for ( auto w: createStrings() ) { std::cout << w << " "; }
std::cout << std::endl;
for ( auto c: createStrings()[0] ) { std::cout << c << " "; }
std::cout << std::endl;
}
如果我们执行此操作,第一个循环将按预期运行,但第二个循环将调用未定义的行为 。 问题是 createStrings()[0] 有两个函数调用。最里面的调用是 createStrings 的调用 ,最外面的调用是对索引运算符[ ]的调用。
未定义行为的原因是 “ createStrings ”返回的临时对象 用作“ operator[ ]”调用的参数,因此,根据 C++ 的规则,临时对象的生存期不会延长。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文:带你走近MISRA C++:2023:MISRA C++的发展史|MISRA C++:2008与AUTOSAR C++14|MISRA C++:2023|MISRA C++:2023规则分类
原文链接:https://polelink.csdn.net/663050a275c93e11c8040c74.html
- 复制链接
- 举报