gpt4 book ai didi

c++ - 条件运算符(?:) work in C++?

转载 作者:IT老高 更新时间:2023-10-28 23:15:02 26 4
gpt4 key购买 nike

我已经写了下面的代码片段:

#include <string>

int main() {
std::string str = "test";
(str == "tes") ? str.replace(0, 1, "T") : 0;
}

(See here)

不幸的是,它会导致 logic_error:

terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct NULL not valid

我想知道编译器构造字符串对象的原因?

最佳答案

三元运算符的工作原理如下:

std::string str = "test";
std::string _; // using _ since you don't store the variable
if (str == "tes") {
_ = str.replace(0, 1, "T");
} else {
_ = 0; // this calls std::string(nullptr);
}

在上面的情况下,你不存储值,但必须注意几个条件:

  1. true case 和 false case 必须是同一类型(或可转换为同一类型)。
  2. 即使该类型没有默认构造函数,它仍然有效(因此它比上面的更复杂)。

这里的问题是你的代码期望类型是 std::string,基于真实情况下的类型。 false-case 中的类型是一个字面量,一个字面量可以被认为等同于 NULL,因此可以被认为是一个 const char* 可以转换为 >std::string。如果您尝试从 nullptr 构造 std::string,则会引发上述异常。

这实际上是相当微妙的,因为如果你使用 0 以外的任何整数字面量,编译器会抛出错误:

#include <string>


int main()
{
std::string s(0); // 0 is comparable to NULL
// std::string s1(1); // compiler error: no constructor found
return 0;
}

小心隐式转换。空值检查和运行时错误非常优雅,让您免于稍后出现细微的错误或崩溃(几乎可以肯定是段错误)。

关于c++ - 条件运算符(?:) work in C++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47879798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com