从评估或临时对象的顺序开始使用带预增量运算符的Buggy表达式​​?

时间:2019-06-11 15:37:19

标签: c++

我使用迭代器创建子字符串。我尝试在表达式中使用pre-increment运算符,但是得到了意外的结果。我相信该代码段在我的部分代码中起作用,但是当我将其剪切/粘贴到另一个函数中时,它的行为有所不同。编译器为MSVC 2019。

我现在认为我有一个order of evaluation问题。 但是,我是否也遇到临时对象的任何问题?

在表达式中使用增量运算符的最佳实践是什么?

using namespace std;
string str{ "The quick brown fox" };
cout << str << endl;

auto it{ begin(str) };
string str2(++it, it + 7); // Temporary object problem here?
cout << str2 << endl; // Observed "he qui". Expected "he quic".

1 个答案:

答案 0 :(得分:3)

MSVC2019是C ++ 17编译器。

这里的“临时对象”没有问题。

函数参数的求值顺序未指定。它不是不是 实现定义的。这意味着您不能保证可以从编译器文档中阐明行为。

因此,您不知道it + 7是使用it的原始值还是增量值。

由于出于可移植性的考虑,应避免使用不使用标准指定行为的代码,因此最佳实践是避免这种情况。