Aqu*_*wer 1 c++ lambda initialization c++20 selfinitialization
为什么初始化std::stringto ""(通过 lambda)会崩溃?
这不会崩溃:
static std::string strTest2 =
[](){std::string * s = &strTest2; (*s) = "a"; return s->c_str();}();`
Run Code Online (Sandbox Code Playgroud)
这个技巧(首先将其初始化为非空,但预期的最终值为空)不会崩溃:
static std::string strTest3 =
[](){std::string * s = &strTest3; (*s) = "b"; (*s) = ""; return s->c_str();}();
Run Code Online (Sandbox Code Playgroud)
在这里崩溃了(*s) = ""。是因为它是空字符串吗?很特别吗?std::string分配给 时是否未构造/初始化""?
static std::string strTest1 =
[](){std::string * s = &strTest1; (*s) = ""; return s->c_str();}();`
Run Code Online (Sandbox Code Playgroud)
所有这些都是未定义的行为。其中一些不会导致崩溃这一事实无关紧要。它们都是无意义的代码。其中一些恰好为您“工作”。这次。
所有这些都是 UB 的原因相同:您在对象初始化之前访问该对象。strTest无法在用于初始化它的表达式中合法访问。这正是您的 lambda 试图做的事情。
为什么那个特定的编译器和构建设置会崩溃,而其他的不会崩溃,这并不重要。它们都不代表有效的 C++ 代码。
| 归档时间: |
|
| 查看次数: |
63 次 |
| 最近记录: |