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

Ita*_*iwa 2 c++ conditional-operator sequence-points

正如我所了解的那样,条件运算符(三元运算符“?”)保证了其操作数的求值顺序,我想知道是否向变量分配了?在两个表达式之一中使用该变量的返回值。是否成为UB。这是我所拥有的:

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

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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的一段代码看起来做工精细,我知道,如果值-1是在无意中发现str,我们不知道是否val拥有-1成功运作或失败(?运营商)的。但是我只想知道我编写的这段代码是否具有UB?

  • 感谢在上一个主题UB中指导我的成员,我已经将其更正。

Nat*_*ica 6

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

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

重点矿

因此,((pos = str.find_first_of("0123456789.+-")) != std::string::npos)被评估时,“到达”序列点,然后根据结果进行评估,std::stoi(str.substr(pos))或者-1以其自己的排序表达式进行评估。