看到一段有問題的code,簡化如下
#include <string> std::string test() { return 0; } int main() { test(); return 0; }
這樣子會compile過嗎? 答案是可以,此範例是可以通過compile。但是0是integer,integer和string應該不相容吧? 的確是不相容,其他的integer會compile不過,剛好 0 例外,在 C++11 4.10描述了 null pointer constant可以被轉成 null pointer
答案是可以,原因就在 std::string 接收 implicit construct from char pointer
A null pointer constant is an integral constant expression (5.19) prvalue of integer type that evaluates to
C++11 § 4.10 Pointer conversions
zero or a prvalue of type std::nullptr_t. A null pointer constant can be converted to a pointer type
所以結果就是 std::string constructor看到null pointer,根據 C++11 21.4.2.9,描述
basic_string(const charT* s, const Allocator& a = Allocator());
Requires: s shall not be a null pointer.
C++11 § 21.4.2.9
標準要求,不可以傳null pointer進去,否則可能是直接abort,可能是exception,結果為UB