精炼表达评估(提案N4228 C 17)
Refining Expression Evaluation (proposal n4228 c++ 17)
阅读提案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将阻止这一点,并且该代码将按预期工作。
相关文章:
- std::complex<> in C++ 数学特殊函数:技术规范或提案
- C++标准提案代码:什么是 N 和 P?
- 提案 N4502 如何运作?("detection idiom")
- 精炼表达评估(提案N4228 C 17)
- 在N2073提案的情况下以及作为一个整体的c++模块设计
- 为什么掉期运营商提案被否决了
- 为什么有 C++14/17 的网络图书馆提案
- 关于"structural binding"的提案在哪里?
- Make_unique数组,原始提案vs.最终提案
- 并行提案 N3554 中的 [包含/排除]_scan算法<algorithm>
- c++ 14/17的模块提案是否可以(容易地)使用其他本地语言来生成模块?