【发布时间】:2021-11-23 11:49:08
【问题描述】:
AFAIK,对于不保证其操作数的求值顺序的运算符,我们不应多次修改操作数。
这里有我写的这个 sn-p:
- 我正在使用 gcc 和 C++20 标准对其进行编译:
-std=c++2b。
int main(){
std::string s = "hello";
auto beg = s.begin();
*beg = *beg++;
std::cout << s << " " << *beg << std::endl;
}
为什么我会得到这个输出?
hhllo h
这个:
*beg = (*beg)++;
std::cout << s << " " << *beg << '\n';
产生这个输出:
hello h
-
为什么
'h'的值没有增加到'i'? -
这里发生了什么?通常,这会将
s中的第一个字符分配回自身,然后递增beg迭代器。但是迭代器并没有递增,而是值发生了变化!我敢打赌这是因为未定义的行为,但如果是这样,那么有人可以向我解释一下吗? -
C++17 标准是否将赋值运算符添加到“序列化”运算符中?如果是这样,为什么它在我的示例中不能正常工作?
【问题讨论】:
-
为什么重要?没有人应该编写那种代码。
-
是的,赋值在 C++17 中排序:en.cppreference.com/w/cpp/language/eval_order。 (如果为 ≥C++17 编译,这意味着没有 UB。)
-
你为什么期待不同的结果呢? C++17 中的变化状态是首先评估右侧,因此左侧的
beg指向第二个字符 -
你真的需要更具体。您使用 C++20 构建的如此重要的细节应该在问题本身中提到。甚至可以作为标签添加。
-
是的,它是安全的,尽管有用性值得怀疑,因为您自己不知道您自己的代码会发生什么行为(尽管第二个代码 sn-p 似乎更多地混淆了后缀递增回报)
标签: c++ c++20 assignment-operator