精炼表达评估(提案N4228 C 17)

Refining Expression Evaluation (proposal n4228 c++ 17)

本文关键字:N4228 提案 评估      更新时间:2023-10-16

阅读提案N4228我读到以下代码:

void f()
{
 std::string s = "but I have heard it works even if you don't believe in it";
 s.replace(0, 4, "").replace(s.find("even"), 4, "only").replace(s.find(" don't"), 6, "");
 assert(s == "I have heard it works only if you believe in it");
}

受未指定的评估顺序的约束,其脆弱性仅是最近被工具发现的。

问题在哪里?也许s.find("even")s.find(" don't")的评估顺序不同?在发生replaces之前?

有人知道哪种工具发现了问题?

是的,你是正确的。根据C -17的规则,可以在替换呼叫的任何之前执行对s.find的两个调用。而且由于替换调用修改了字符串,因此它们可能导致find返回的索引在使用时不再有效。

(不幸的是较弱的)规则投票为C 17 CD将阻止这一点,并且该代码将按预期工作。