2011-12-05 4 views
7

C++のユーザー定義リテラル演算子にnullポインタを渡すことはできますか?C++のユーザー定義リテラル演算子にnullポインタを渡すことはできますか?

これはg ++の実験版(gccバージョン4.7.0 20111114(実験)[トランクリビジョン181364](Debian 20111114-1))で実際に起こっていますが、これがバグかどうかはわかりませんまたはいくつかの奇妙な期待された動作。

プログラム例:

#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、私は、この行動が私をいかに混乱させるかと思います。 ;)ユーザー定義のリテラルサポートを追加していた、もっと複雑な実際の問題で、この動作に遭遇したときに何が失敗していたのかを理解するまでには、約30分かかりました。私は文言を修正する必要があります。 =) – wjl

+1

これはコンパイラのバグです。 C++ 11§2.14.8/ 3 "*リテラルL *は' operator "" X( "n") '"という形式の呼び出しとして扱われます。そのルールに対する例外(適用時)は定義されていません。乾杯、 –

答えて

5

Alf P. Steinbachが素敵なコメントで私に保証したように、これは標準的な動作ではなくバグです(gccスナップショットを使用していたので大きな問題はありません)。

私はgccのバグを報告するために行ってきましたが、それはすでに提出されて上流固定ているように見える:

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

関連する問題