2011-12-05 51 views
7

C++用戶定義的文字操作符是否可以傳遞空指針? (gcc版本4.7.0 20111114(實驗)[trunk revision 181364](Debian 20111114-1)),但我不確定這是否是一個錯誤(90%肯定)或一些奇怪的預期行爲。C++用戶定義的文字操作符是否可以傳遞空指針?

示例程序:

#include <iostream> 
#include <stdexcept> 
#include <string> 

std::string operator "" _example (const char * text) { 
    using std::cerr; 
    using std::endl; 
    cerr << "text (pointer) = " << static_cast<const void *>(text) << endl; 
    if (!text) throw std::runtime_error("Is a null pointer really expected?"); 
    cerr << "text (string) = \"" << text << '"' << endl; 
    return text; 
} 

int main() { 
    2_example; 
    1_example; 
    0_example; 
} 

輸出(可能在GCC的錯誤......但也許不是,所以這個問題嗎?!):

text (pointer) = 0x8048d49 
text (string) = "2" 
text (pointer) = 0x8048d4b 
text (string) = "1" 
text (pointer) = 0 
terminate called after throwing an instance of 'std::runtime_error' 
    what(): Is a null pointer really expected? 
Aborted 

這不只是 「0_example」;只要文字值爲零就是。例如,即使文字是「0x0000_example」,它仍然會發生。

這是一個錯誤?或者當文字的值爲零時出現一些奇怪的特殊情況?

+0

10%不確定== 90%的把握,所以你是90%肯定它是一個錯誤和90%確定它是預期的行爲。 –

+1

@Seth heh,我想這就是這種行爲對我造成的困惑。 ;)當我在添加用戶定義的文字支持的更加複雜的真實問題中遇到這種行爲時,花了將近半小時的時間來弄清楚失敗的原因。我想我應該修正措辭。 =) – wjl

+1

¤這是一個編譯器錯誤。 C++ 11§2.14.8/ 3「將* literal L *視爲」operator「」X(「n」)'「形式的調用。該規則沒有例外(適用時)。乾杯&hth。, –

回答

5

正如Alf P. Steinbach向我保證一個很好的評論,這是一個錯誤,而不是標準行爲(沒有什麼大不了的,因爲我使用的是gcc快照)。

我去提交gcc的錯誤,但它看起來像它已經被提交,並修正了:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50958

相關問題