2013-03-12 11 views
12
void operator"" test(const char* str, size_t sz ) 
{ 
    std::cout<<str<<" world"; 
} 

int main() 
{ 
    "hello"test; 
    return 0; 
} 

、これは「警告: 『_』が先行していないリテラル演算子サフィックスは、将来の標準化のために予約されています[デフォルトで有効になって]」生成」この警告が生成された理由を私は理解しますが、GCCは言うユーザ定義のリテラルでアンダースコアが見つからないというGCCの警告を無効にすることはできますか? GCC 4.7で

をデフォルトで有効になっています。

-wフラグですべての警告を無効にするだけでなく、この警告を無効にすることはできますか?

+4

うわー、私はC++ 11が[operator ""](http://ideone.com/ZDyCML)のオーバーロードをサポートしていることは知っていません。ところで、ideoneに存在するg ++は少なくとも警告しませんが、ローカルのコンパイラは警告します。他人の情報(コンテキストを知らない人)のために、 'test'を' _test'に変更することで警告が消えます。 – iammilind

+12

なぜあなたはしたいですか?後のC++バージョンには、潜在的に競合するシンボルが含まれる可能性があります。それは良くないね*。 GCCの問題は、それがあなたに*エラー*を与えるものではないということです。 –

+1

@ニコル、あなたのコメントを感謝します。私は-Werrorを使用しているので、この警告は実際に私にエラーをもたらします。 GCCには多くの貴重な警告がありますが、プログラマがそれらを明示的に無効にすることは可能です。 – cmeub

答えて

4

この質問にいくつかのコメントを読んだ後、私はC++ 11標準(非最終草案N3337)を見直しました。

「私はこの警告がなぜ発生するのか理解している」と言ったとき、私は間違っていました。 私は、アンダースコアが技術的に標準では必要ではなく、推奨事項であると仮定しました(したがって、エラーではなく警告です)。

しかしニコルボーラは、ユーザ定義リテラルについて話すときの標準は次の言語を使用して、育てているように:

「アンダースコアで始まらないリテラル接尾識別子は、将来の標準化のために予約されています。」

"このようなud接尾辞を含むプログラムは不正であり、診断は必要ありません。"

これは予約済み識別子に使用される言語、および "and"、 "or"、 "not"などの "代替表現"に似ています。私は、これが実際には最初の警告ではなく、エラーであるべきであることをかなり明確にしていると思います。

「これは無効にすることができますか?」という質問への直接的な回答ではないかもしれませんが、私にとっては十分な答えです。

Nicolあなたが答えとしてあなたのコメントを投稿したいのであれば、私はあなたにマークされた答え(私は可能だと思います)を変更します。

関連する問題