2011-11-12 109 views
7

該代碼片段是否正確或者是否會導致未定義的行爲?調用空字符串的c_str

std::string s; 
assert(strlen(s.c_str())==0); 

如果它不是未定義的行爲,上述斷言是否會通過?

回答

5

是的,它會工作(如果你追加()c_str,使之能調用函數),並斷言會通過。

1

這是一個編譯錯誤(如果您啓用了斷言),因爲const char *(std::string::*)()不能隱式轉換爲const char *

(舌僅在臉頰中間。)

7

這是非常好的定義和斷言通過。 c_str()函數將始終返回一個有效的零終止的C字符串。

通常會使用empty()來測試空字符串。