使用空指针参数和不可能的后置条件构造标准异常
考虑以下程序: #include<stdexcept> #include<iostream> int main() { try { throw std::range_error(nullptr); } catch(const std::range_error&) { std::cout << "Caught!\n"; } } 使用libstdc ++调用的GCC和Clang std::terminate并通过消息中止程序 terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_S_construct null not valid 用libc ++ segfaults构造异常的Clang。 见godbolt。 编译器的行为符合标准吗?标准[diagnostics.range.error](C ++ 17 N4659)的相关部分确实说std::range_error有const char*构造函数重载,应该优先于const std::string&重载。本节也没有说明构造函数的任何前提条件,而只说明了后置条件 后置条件:strcmp(what(), what_arg) == 0。 如果what_arg为空指针,则此后置条件始终具有未定义的行为,那么这是否意味着我的程序也具有未定义的行为并且两个编译器的行为一致?如果没有,应该如何阅读标准中如此不可能的后置条件? …