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"であっても依然として発生します。
これはバグですか?あるいは、リテラルの値がゼロのときには、何か変わった特別なケースですか?
10%わからない== 90%を確認してくださいので、あなたはそれが90%確信していますバグと90%が動作を期待していることを確認します。 –
@Seth heh、私は、この行動が私をいかに混乱させるかと思います。 ;)ユーザー定義のリテラルサポートを追加していた、もっと複雑な実際の問題で、この動作に遭遇したときに何が失敗していたのかを理解するまでには、約30分かかりました。私は文言を修正する必要があります。 =) – wjl
これはコンパイラのバグです。 C++ 11§2.14.8/ 3 "*リテラルL *は' operator "" X( "n") '"という形式の呼び出しとして扱われます。そのルールに対する例外(適用時)は定義されていません。乾杯、 –