【发布时间】:2018-09-13 09:58:51
【问题描述】:
我有一个 sql 语句,为了调试,我想打印它。该语句包含占位符,我想在打印之前将占位符填充到一个指令行中。这是有效的还是 UB?
std::string query("SELECT A, B FROM C WHERE D = ? and E = ?;");
std::cout << query.replace(query.find("?"), 1, "123").replace(query.find("?"), 1, "234") << std::endl;
是指令的顺序
- 查找第一个问号的位置
- 替换查询中的第一个字符串
- 在第一次替换后查找第二个问号的位置
- 替换查询中的第二个字符串
保证或者有可能两个find操作都可以在replace操作之前调用
- 查找第一个问号的位置
- 在第一次替换之前找到第二个问号的位置
- 替换查询中的第一个字符串
- 替换查询中的第二个字符串
我问是因为:
几乎所有 C++ 运算符的操作数的求值顺序 (包括函数参数的求值顺序 函数调用表达式和计算的顺序 任何表达式中的子表达式)未指定。编译器可以 以任何顺序计算操作数,并且当 再次计算相同的表达式。
编辑: 本项目不能使用第三方依赖。
【问题讨论】:
-
将它包裹在 lambda 中是否仍然符合一个衬垫的条件?
std::cout << [&] { query.replace(query.find("?"), 1, "123"); query.replace(query.find("?"), 1, "234"); return query; }() << std::endl; -
@KillzoneKid:问题不在于找到一个可行的衬里,而在于了解这是否有效或 UB 并避免未来的错误。但我喜欢使用 lambdas 的想法。