在条件运算符中使用对象两次会产生 UB 吗?

Does using an object in conditional operator twice yield UB?

本文关键字:两次 UB 条件运算符 对象      更新时间:2023-10-16

正如我了解到的条件运算符(三元运算符"?"(保证其操作数的计算顺序 我想知道是否将返回分配给变量?该变量在其两个 expr 之一中使用。 是否是 UB。这是我所拥有的:

我编写了这个程序,它尝试根据字符串str是否包含有效的数字字符将字符串转换为整数,例如:+-.0123456789,所以我在一个表达式中使用了std::stoistd::string::find_first_of和条件运算符的组合:

std::string str = "a^%^&fggh67%$hf#$";
std::size_t pos = 0;
auto val = (((pos = str.find_first_of("0123456789.+-")) != std::string::npos) ?
std::stoi(str.substr(pos)) : -1);
std::cout << val << std::endl; // 67
str = "a^%^&fggh__#$!%$hf#$";
pos = 0;
val = (((pos = str.find_first_of("0123456789.+-")) != std::string::npos) ?
std::stoi(str.substr(pos)) : -1);
std::cout << val << std::endl; // -1

正如你所看到的,这段代码看起来工作正常,我知道如果在str中意外发现值-1,我们不知道val是否持有成功操作或失败-1(?运算符(。但我只想知道我写的这段代码是否有 UB?

  • 感谢在上一个主题(即 UB(中指导我的成员,我已经纠正了它。

代码没有未定义的行为。 条件运算符由 [expr.cond]/1 定义为

条件表达式从右到左分组。第一个表达式在上下文中转换为布尔值。它被计算,如果为 true,则条件表达式的结果是第二个表达式的值,否则是第三个表达式的值。仅计算第二个和第三个表达式中的一个。与第一个表达式关联的每个值计算和副作用在与第二个或第三个表达式关联的每个值计算和副作用之前进行排序。

强调我的

因此,((pos = str.find_first_of("0123456789.+-")) != std::string::npos)被评估,一个序列点被"到达",然后根据结果,std::stoi(str.substr(pos))-1在其自己的序列表达式中被评估。